TripleDES Расшифровка усечения последнего символа - PullRequest
1 голос
/ 01 марта 2012

У меня есть класс .NET, который реализует шифрование и дешифрование TripleDES.Код слишком много, чтобы размещать здесь.Однако проблема в том, что, хотя шифрование в порядке, дешифрование несовместимо в зависимости от длины исходного открытого текста.Я знаю, что шифрование в порядке, так как другие тройные инструменты DES также дают то же значение.

В частности, последний символ обрезается из полученного простого текста, если длина исходного открытого текста была 8,16,2432,40 и т. Д., Т.е. 8n.

Режим шифрования - CBC. Размер ключа - 24 символа (192 бита). IV - 8 символов

.

1 Ответ

4 голосов
/ 01 марта 2012

Проблема в том, что (не) алгоритм заполнения не является правильным.

(3) DES шифрует / дешифрует блоки по 8 байт. Поскольку не все тексты имеют размер 8 байтов, последний блок должен содержать байты, которые не являются оригинальными из простого текста. Теперь уловка состоит в том, чтобы выяснить, какой из них является последним символом простого текста. Иногда длина простого текста известна заранее - тогда символы заполнения могут быть чем угодно.

Если длина простого текста неизвестна, то должен использоваться детерминированный алгоритм заполнения, например, PKCS5Padding. PKCS5Padding всегда выполняет заполнение, даже если открытый текст имеет размер блока N * в байтах. Причина этого проста: в противном случае он не знает, является ли последний байт простым текстом или заполнением: 41 41 41 41 41 41 41 41 08 08 08 08 08 08 08 08 будет 8 символами 'A' с 8 байтами заполнения.

Похоже, либо алгоритм распаковки не реализован должным образом, либо используется недетерминированный алгоритм заполнения.

...