Расшифровка AES без заполнения в криптовом файле - PullRequest
0 голосов
/ 26 апреля 2018

Я хотел бы расшифровать файл шифрования без заполнения алгоритмом AES 128 бит: IV (начальный вектор) и ключ имеют длину 16 байтов. Я мог бы использовать OpenSSL для этого, но я не буду использовать его, чтобы сравнить результат с ним. Моя главная проблема не в том, чтобы отменить заполнение криптованных файлов, а в том, чтобы восстановить его, и я не знаю, как это сделать, и OpenSSL это делает. Например, для файла размером 19 байт заполнение файла шифрования будет иметь длину 13 байтов, поэтому файл шифрования будет сохранен как 32 байта, но я хочу его удалить. Есть ли небольшая функция для добавления в мою программу на C / C ++, которую я должен использовать?

Редактировать: не отвечайте быстро на мой вопрос, этот код будет использоваться не на компьютере, а на маленькой электронной карточке, и у меня нет некоторых полезных команд; это легкая ОС Linux на нем

Блоки AES имеют длину 16 байтов, поэтому их нужно заполнять, когда ваш последний блок не имеет длины 16 байтов

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2018

Шифротексты не дополняются - открытые тексты дополняются, так что они являются допустимым входным сигналом для алгоритма шифрования.

Алгоритм AES требует , чтобы входное значение было целым числом 16-байтовых блоков, а его выходная длина была равна длине входного значения.

Итак, для вашего 19-байтового незашифрованного файла любой инструмент, который вы используете для шифрования:

  1. Добавление 13 байтов (вероятно, в конце), в результате получается открытый текст с 32 байтами. Результат должен содержать информацию о заполнении, чтобы принимающая сторона могла его удалить.
  2. Шифрование дополненного открытого текста с получением 32-байтового зашифрованного текста

Важная информация равномерно распределяется между 32 байтами зашифрованного текста, поэтому невозможно обрезать зашифрованный текст, не сделав его бесполезным .

В конце концов, когда вы расшифровываете, вам нужно:

  1. Расшифруйте 32-байтовый зашифрованный текст, получив 32-байтовый открытый текст
  2. Удалите последние 13 байтов, получив исходный текст

Формулировка вашего вопроса предполагает, что вы уже знаете, как расшифровать, и что проблема заключается в удалении отступов.

Итак, как вы узнаете, сколько байтов нужно обрезать? Это зависит от того, какая схема заполнения была использована для его создания. Их много - см. Википедию .

Одной из распространенных схем заполнения является PKCS # 7, в которой все байты заполнителя имеют значение n , где n - количество добавленных байтов. Таким образом, в вашем примере все 13 байтов заполнения байтов имеют значение 13. Чтобы удалить это, просто прочитайте последний байт и обрежьте это количество байтов.

(Обратите внимание, что в PKCS # 7 для входа, который уже содержит целое число блоков, будет добавлен дополнительный блок с каждым байтом, установленным в 16.)

Но, не , предположим, ваша сторона шифрования использует PKCS # 7 - узнайте наверняка. Либо, посмотрев документацию / источник о том, что делает шифрование, либо эмпирически, расшифровав и изучив содержимое еще открытого текста.

...