Я новичок в шифровании C++ и блочного шифрования, и в настоящее время я пишу функцию дешифрования для AES (16-байтовые начальные / 16-байтовые блоки). Все идет хорошо, но мой общий размер данных не всегда кратен размеру моего блока. Мне интересно, как лучше всего обрабатывать оставшиеся данные в конце моих данных.
Я использую Crypto ++ для библиотеки AES.
Функция ProcessBlock() принимает массив входных и выходных символов. Я предполагаю, что они будут, по крайней мере, достаточно большими, как размер блока.
Как лучше всего обработать все 16-байтовые блоки в блочном шифре, а затем также обработать оставшиеся данные?





Вам нужна система набивки.
Ознакомьтесь с этой статьей CodeProject о Crypto ++:
When a message is not a multiple of the cipher's block size, ECB or CBC mode messages must be padded. The method and values of padding are a source of problem with respect to interoperability between Cryptographic libraries and APIs. As Garth Lancaster points out, if you're not aware of the particulars of padding, use the StreamTransformationFilter. In this case, the Crypto++ filter will pad for you.
Существует стандарт PKCS для того, что называется "заполнением".
См. страница википедии, но это равносильно заполнению одним из следующих элементов:
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
Таким образом, во время дешифрования вы узнаете, где заканчивается исходное сообщение ...
Это больше, чем просто обивка - вам нужен режим работы. Блог Good Math, Bad Math пишет отличную серию статей о том, что это такое и как их использовать здесь. Также см. запись в Википедии. Одна вещь, которая действительно, очень важна: никогда и никогда не используйте режим ECB (Электронная кодовая книга), когда вы шифруете каждый блок независимо. Это очевидный способ сделать это, но он обеспечивает ужасающе низкую безопасность.
Однако в идеале вам даже не нужно делать это самому. Ваша криптографическая библиотека должна предоставить это. Если этого не произойдет, я бы посоветовал перейти на что-нибудь другое. как OpenSSL.