Зашифрованные и дважды зашифрованные байты зашифрованы?

Я получаю пакеты через сеть. Но некоторые из этих пакетов имеют динамическую длину, поэтому второй байт имеет WORD длиной 2 байта, который содержит длину. Поэтому я сначала получаю номер пакета, а затем получаю все в соответствии с длиной. Здесь все хорошо, когда нет шифрования. Будет ли это так же, если я использую шифрование twofish или blowfish? Что я имею в виду, "A" шифруется как "B", но будет ли "AA" шифроваться как "BB"? Могу ли я извлечь байт и расшифровать его из пакета, зашифрованного с помощью TF/BF в целом?

3 ответа

Обычно ответ заключается в заполнении зашифрованных данных. Однако не просто дополняйте, добавляя 0, пока не доберетесь до длины блока; заполнение может дать слишком много информации.

Что касается извлечения байта, в зависимости от используемого режима шифрования - как шифр изменяется между блоками - вы не должны быть в состоянии сделать это. Вам нужно будет расшифровать весь байт, который вы хотите прочитать. Общепринятая практика заключается в том, чтобы шифрование было "прозрачным" - то есть вы выполняете сетевое программирование, затем подключаете к нему SSL, чтобы SSL обрабатывал все шифрование, работая с переменными длинами и т. Д., И вам просто приходилось иметь дело с простыми старыми данными,

Относительно того, является ли использование SSL в этом плане хорошей идеей для вашего дизайна, я понятия не имею, но вы можете использовать эту концепцию.

Что я имею в виду, "A" шифруется как "B", но будет ли "AA" шифроваться как "BB"?

Разумный алгоритм шифрования никогда не сделает этого, иначе зашифрованная информация может быть легко взломана с помощью частотного анализа. (Кстати, это называется шифром замещения). Это, конечно, верно * для любопытных рыб и двойников.

Даже если вы хотите извлечь байт посередине, вы должны сначала расшифровать весь пакет.


*: если вы не используете слабый режим ECB, который сводит только два алгоритма шифрования к шифрам замещения для 64-битных /128-битных блоков).

Twofish на своем базовом уровне кодирует 16-байтовые блоки. Таким образом, минимальная часть данных, зашифрованных Twofish, может иметь длину 16 байтов. Если ваши данные содержат длину, вы можете расшифровать ее, а затем выбросить лишние байты в последнем блоке.

Таким образом, чтобы зашифровать "А", вам нужно дополнить его (каким-то образом - есть разные способы - все нули, видимо, не самый лучший способ) до 16 байт, а затем зашифровать один байт данных и 15 нежелательных байт. Вы получаете 16-байтовый зашифрованный блок. При расшифровке вы можете выбросить лишние байты.

Я предлагаю полчаса читать эти статьи Википедии:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

http://en.wikipedia.org/wiki/Padding_%28cryptography%29

Оба они были полезны для меня.

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