Вопрос или проблема
Я предполагаю, что OpenSSL просто использует эти функции здесь. страница 66 – CBC
https://www.intel.com/content/dam/develop/external/us/en/documents/aes-wp-2012-09-22-v01-165683.pdf
Могу я просто случайно сгенерировать ключ/iv и передать данные с помощью этих функций для шифрования/расшифрования? Если да, то почему функция расшифрования больше или даже отличается от функции шифрования? Разве они не должны быть одинаковыми? У меня есть программа на C, которая выполняет симметричное шифрование с помощью функций EVP и работает нормально, но я хочу написать встроенную программу без OpenSSL или каких-либо других библиотек. Я делал это для derivation ключа (традиционный метод – MD5) и это заняло у меня много времени. Это для данных конкретно AES 256. Он шифрует в 256 байтах или это 16? Я в сильном замешательстве по этому поводу.
Генерируйте случайные ключи и IV для шифрования/расшифрования AES-256, используя фиксированные 16-байтовые блоки, несмотря на различия в размерах функций шифрования/расшифрования из-за внутренних вариаций реализации.
Ответ или решение
Подробное руководство по реализации рутин AES CBC на ассемблере
Введение
AES (Advanced Encryption Standard) является одним из наиболее широко используемых алгоритмов симметричного шифрования. Один из режимов работы AES — CBC (Cipher Block Chaining), который обеспечивает большую безопасность путем связывания между блоками данных. В данной статье мы рассмотрим реализацию рутин для шифрования и дешифрования с использованием AES в режиме CBC на ассемблере, а также ответим на некоторые важные вопросы, касающиеся генерации ключей и векторов инициализации (IV).
1. Генерация ключей и IV
Для обеспечения безопасности, ключ и вектор инициализации должны быть случайными. Например, для AES-256 необходимо генерировать 32 байта (256 бит) ключа. Вектор инициализации (IV) также должен быть 16-байтовым (128 бит для AES), поскольку AES работает с 16-байтовыми блоками:
; Пример псевдокода для генерации случайных ключей и IV
CALL RandomBytes, Key, 32 ; Генерация 32 байт ключа
CALL RandomBytes, IV, 16 ; Генерация 16 байт IV
2. Шифрование и дешифрование
Как вы уже заметили, функции шифрования и дешифрования различаются не только по размеру, но и по своей реализации. Основная причина этого заключается в том, что процесс шифрования включает в себя одну процедуру, а дешифрование — другую.
- Шифрование: Каждый блок данных шифруется, используя текущий ключ и IV.
- Дешифрование: Каждый блок данных, в свою очередь, расшифровывается, что требует более сложной обработки.
Это ведет к тому, что функции могут иметь различную реализацию и, как следствие, различный размер.
3. Размер блоков
AES работает с фиксированными размерами блоков в 16 байтов (128 бит), поэтому даже для AES-256 данные обрабатываются блоками по 16 байт:
| Блок 1 (16 байт) | Блок 2 (16 байт) | ... | Блок N (16 байт) |
4. Возможное упрощение – задание
Прежде чем создавать ассемблерную реализацию, важно понимать основные концепции алгоритма AES и их реализацию в режиме CBC. AES требует нескольких этапов, включая подстановку байтов, перетасовку рядов, смешивание столбцов и добавление раундового ключа. Для реализации этих шагов на уровне ассемблера потребуется понимание внутренних операций процессора и разработки низкоуровневого кода.
5. Если вы решите реализовать AES на ассемблере
Вот некоторые рекомендации по созданию акта шифрования AES на ассемблере:
-
Изучите и поймите ключевые этапы алгоритма AES. Основные этапы шифрования включают:
- Подстановка байтов (SubBytes)
- Сдвиг рядов (ShiftRows)
- Смешивание столбцов (MixColumns)
- Добавление раундового ключа (AddRoundKey)
-
Поймите работу с памятью. Вам нужно управлять размещением данных в памяти и правильным доступом к ним.
-
Оптимизируйте ваш код. Ассемблер — это мощный, но сложный язык, требующий оптимизации для достижения высокой производительности.
Заключение
В разработке системы шифрования важно понимать, что нельзя просто использовать функции шифрования без более глубокого понимания основных концепций и обработки данных. Реализация AES в режиме CBC на ассемблере — это сложная задача, требующая внимания к деталям, поэтому рекомендуется изучить каждый этап алгоритма и самостоятельно реализовать его на низком уровне. Это обеспечит вам безопасность и надежность вашего собственного решения.