Лучший способ обрабатывать блочные шифры в C++? (Крипто ++)

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

Я использую Crypto ++ для библиотеки AES.

Функция ProcessBlock() принимает массив входных и выходных символов. Я предполагаю, что они будут, по крайней мере, достаточно большими, как размер блока.

Как лучше всего обработать все 16-байтовые блоки в блочном шифре, а затем также обработать оставшиеся данные?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 056
3

Ответы 3

Вам нужна система набивки.

Ознакомьтесь с этой статьей 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.

Другие вопросы по теме