Бывает так, что при разработке какого-либо устройства необходимо скрыть передаваемую информацию, иначе говоря – зашифровать. Особенно такая необходимость возникает при передачи данных открытым способом: по линиям связи (проводам) или по радиоканалу. Существует множество алгоритмов шифрования, каждый имеет свои особенности и стойкость. В этой статье вы найдете как просто и достаточно крепко зашифровать свои данные.
Я не стану описывать теории криптографии, ее много и она не простая. В статье рассмотрим лишь реализацию. Подробнее можно почитать, например, на Википедии.
За основу библиотеки взят труд немцев: ссылка. Написана была библиотека для AVR, однако переписал ее для использования и на STM32, при желании можно перенести и на STM8.
Библиотека позволяет шифровать и дешифровать по алгоритму AES с ключами 128, 196 и 256 бит. Причем шифрование и дешифровка производится достаточно быстро:
function | clock cycles |
init (128 bit) | 4632 |
init (192 bit) | 5082 |
init (256 bit) | 6161 |
enc (128 bit) | 21279 |
enc (192 bit) | 25724 |
enc (256 bit) | 30174 |
dec (128 bit) | 39340 |
dec (192 bit) | 47799 |
dec (256 bit) | 56253 |
Блок для шифрования должен быть длиной 16 байт, не больше, не меньше. Это особенность алгоритма. Поэтому, если нужно зашифровать блоки большего размера, то нужно разбить его на кратные 16 байт.
Перед использованием в программе, необходимо сгенерировать вспомогательную переменную.
Для начала объявим переменные:
1 2 |
uint8_t AES_key[16]; aes128_ctx_t AES_ctx; |
Важно отметить то, что ключ должен располагаться в RAM. Далее генерируем переменную, где будут храниться матрицы для шифрования и дешифрования:
1 |
aes128_init(AES_key, &AES_ctx); |
Можно использовать функции для 128, 196 и 256 битного ключа.
Ну а далее шифрование и дешифрование производится элементарно:
Теперь шифруем:
И дешифруем:
Как видим данные успешно были дешифрованы и они соответствуют исходным.
В заключении архив с проектом и библиотекой ссылка
Статья хорошо помогла. Импортировалась в Keil без проблем. Спасибо!