Как PKCS7 не теряет данные?

Я разрабатываю загрузчик USB для встроенной системы, и одно из моих требований заключается в том, что передача данных через USB должна быть безопасной (потерпите меня, я новичок в шифровании). Я решил зашифровать данные с помощью AES, но данные не всегда представляют собой хорошие 16-байтовые фрагменты, поэтому мне нужно их дополнить. Кажется, что PKCS7 — это стандартный метод, используемый при заполнении данных для AES (не говоря уже о том, что это довольно простой), поэтому я думаю, что хотел бы использовать его.

Проблема в том, что я не могу понять, как PKCS7 не теряет данные. Поясню на примере:

Представьте себе 16-байтовый буфер, который нужно зашифровать, последний символ которого равен 0x01. Теперь представьте, что нужно зашифровать 15-байтовый буфер... этот буфер будет дополнен 0x01. После того, как оба буфера зашифрованы, переданы, получены и расшифрованы, как получатель распознает разницу между буфером с заполнением и буфером, фактический последний символ которого равен 0x01?

Я чувствую, что мне чего-то не хватает в спецификации PKCS7. Может ли кто-нибудь помочь мне понять? Заранее спасибо.


person Trey German    schedule 16.09.2011    source источник


Ответы (2)


Да, вы упускаете момент. Если длина данных кратна длине блока (т. е. кратна 16 байтам для AES), заполнение добавит дополнительный полный блок (из 0x10 или 16) вместо ничего.

Таким образом, мы всегда можем восстановить длину отступа из самого отступа, так как не существует «отступа с нулевой длиной».

С другой стороны, зашифрованные данные всегда больше, чем обычный текст, максимум на целый блок.

(Аналогичное заполнение выполняется для большинства хеш-функций, таких как SHA-1, перед фактической обработкой хеширования, поэтому заблокированный ввод для фактического хеширования не имеет коллизий — в некоторых случаях добавляется даже немного больше, чем полный блок, поскольку фактически хешированные данные заканчиваются исходной длиной данных).

person Paŭlo Ebermann    schedule 16.09.2011

Предположим, что длина блока равна 4 вместо 16 для простоты.

Вот несколько незаполненных сообщений (hex):

01
01 02
01 02 03
01 02 03 04

Мягкие формы из них:

01 03 03 03
01 02 02 02
01 02 03 01
01 02 03 04 04 04 04 04

Глядя на последний байт заполненной формы, вы однозначно говорите, сколько байтов нужно удалить и какими должны быть значения этих байтов. Если последний байт равен 04, необходимо удалить 4 байта, и все они должны быть 04 байта; все остальное указывает на повреждение сообщения.

person Jonathan Leffler    schedule 16.09.2011