Вопрос по – Turbopower Lockbox3 - Могу ли я контролировать вектор инициализации и заполнение для шифрования AES-256?

2

В процессе перехода от Delphi2007 к XE2 мы думаем о переключении библиотек шифрования с DCPCrypt на Turbopower Lockbox 3.

а) В DCPCrypt у меня есть явный контроль над вектором инициализации. Как бы я установить IV в TPLB3?

б) DCPCrypt не имеет заполнения, перед шифрованием мы дополняем ноль открытым текстом. Как работает TPLB? Конечно, мы могли бы сделать это сами.

Test Vector Cipher = AES-256; Chaining mode = CBC; Termination = C# style all-zero-padding; IV transmission = Full block prepended in the clear in the ciphertext stream. Key = 33d46cffa158533194214a91e712fc2b45b587076675affd910edeca5f41ac64 little-endien IV = 917fe226df8308f4d96c33304768354a Ciphertext = +kdTGzdV5KZIw8tv466nhQ== (base64) Plaintext = 'a_decent_text' (ansistring)

Спасибо январь

Ваш Ответ

1   ответ
3

a) IV

Позвольте мне предисловие, сказав, что вы, возможно, пытаетесь решить проблему, которая не требует решения. Lockbox 3 самосоленый. Это означает, что в большинстве случаев 64-битный одноразовый номер автоматически генерируется и вставляется в IV. Значение nonce передается посредством вставки в поток зашифрованного текста. В результате вы можете использовать компонент TCodec без написания одной строки кода для управления IV, и вы по-прежнему получаете все криптографические преимущества соления (в основном это означает непредсказуемые IV). Это в отличие от DCPCrypt, где вы либо обнулили IV, либо самостоятельно управляете IV.

Я не могу представить сценарий, кроме тестирования «Известный тестовый ответ», который вы хотели бы или должны переопределить, но сказав это, если вы действительно хотите настаивать на установке собственных IV, если у вас есть резюме. клиент, вы можете загрузить ревизию 231 (пока не статус «стабильного выпуска») и реализовать обработчик события OnSetIV () компонента TCodec, чтобы установить для IV свое собственное значение. Поскольку IV передается вместе с сообщением, этот шаг не требуется при расшифровке.

Дай мне знать, если тебе нужен демо-код.

b) Padding (исправлено с первого поста. Извините за ошибку.)

Это зависит от метода цепочки. При использовании стандартного потокового адаптера завершение обрабатывается в следующих случаях.

Сообщения нулевой длины:

Сообщения нулевой длины шифруются как зашифрованный текст нулевой длины.

ECB mode:

Для режима ECB Lockbox 3 использует заполнение метода 2 ISO / IEC 9797-1. Метод 2 ИСО / МЭК 9797-1, по сути, представляет собой блок из одного байта со значением $ 80, за которым следует столько нулевых байтов, сколько требуется для достижения границы следующего блока.

Не ECB, но сообщение выровнено по блокам:

Нет заполнения. Никакой специальной обработки завершения не требуется.

Режим потоковой передачи ключей (например, OFB)

Нет заполнения. Прекращение обрабатывается усечением.

Други (например, CBC)

Нет заполнения. Завершение обрабатывается путем кражи зашифрованного текста, который «слишком крут для школы»! Если сообщение слишком короткое для кражи зашифрованного текста (менее 2 блоков), оно автоматически переключается на бит CFB-8 и рассматривается как потоковая передача ключей.

ОБНОВИТПредостережени

LockBox 3 никогда не был разработан для обеспечения взаимодействия с управляемым пользователем IV в стиле CSharp и заполнением нулями. (ИМХО, этот тип заполнения проблематичен и его следует избегать).

Следующий фрагмент кода демонстрирует расшифровку LockBox3 из тестового вектора, указанного в комментариях. Предполагается, что потоку зашифрованного текста предшествует полный IV, и что кодек шифрования использует (ненадежно) заполнение нулям

procedure TForm5.Button1Click(Sender: TObject);
const
  Key: ansistring = #$33#$d4#$6c#$ff#$a1#$58#$53#$31#$94#$21#$4a#$91#$e7#$12#$fc#$2b +
                       #$45#$b5#$87#$07#$66#$75#$af#$fd#$91#$0e#$de#$ca#$5f#$41#$ac#$64;
  Reference_Plaintext: ansistring = 'a_decent_text';
  IV: ansistring = #$91#$7f#$e2#$26#$df#$83#$08#$f4#$d9#$6c#$33#$30#$47#$68#$35#$4a;
var
  Stream, ReconStream: TStream;
  Cipherb64: ansistring;
  Recon_Plaintext: ansistring;
begin
Stream := TMemoryStream.Create;
Stream.WriteBuffer( Key[1], Length( Key));
Stream.Position := 0;
CryptographicLibrary1.RegisterStreamCipher( StreamToBlock_Adapter_CSharpVariant);
Codec1.StreamCipherId := 'CSharp.StreamToBlock';
Codec1.BlockCipherId  := Format( AES_ProgId, [256]);
Codec1.InitFromStream( Stream);
Stream.Size := 0;
Stream.WriteBuffer( IV[1], Length( IV));
Cipherb64 := '+kdTGzdV5KZIw8tv466nhQ==';
Base64_to_stream( Cipherb64, Stream);
ReconStream := TMemoryStream.Create;
Stream.Position := 0;
Codec1.DecryptStream( ReconStream, Stream);
ReconStream.Position := 0;
SetLength( Recon_Plaintext, ReconStream.Size);
ReconStream.ReadBuffer( Recon_Plaintext[1], Length( Recon_Plaintext));
SetLength( Recon_Plaintext, StrLen( PAnsiChar( Recon_Plaintext)));
ReconStream.Free;
Stream.Free;
if Recon_Plaintext = Reference_Plaintext  then
    ShowMessage( 'Test passed! LockBox3 decrypts from CSharp-style zero padding.')
  else
    ShowMessage( 'Test failed!')
end;
Некоторые моменты, на которые стоит обратить внимание: Предполагается, что вы предварительно создали TCodec и TCryptographicLibrary (с произвольным именем), вероятно, в форме во время разработки. Режим цепочки TCodec и другие свойства уже были установлены во время разработки. В случае нашего тестового вектора он должен быть установлен в CBC. Данный потоковый адаптер является специальным адаптером, который обычно не входит в криптографическую библиотеку. Вот почему есть строка кода для явной регистрации. Вам понадобится клиент CVS, чтобы загрузить последнюю версию из репозитория TurboPower LockBox 3 CVS. Этого адаптера еще нет в официальной стабильной версии. Используя этот адаптер, вы можете только расшифровать. CSharp-совместимое шифрование пока недоступно. (Дайте мне знать, если вам это нужно раньше, чем позже). Я тестировал его на Delphi 2007 и Delphi 2010. Он работает для меня. Коррекция

Максимальная длина короткого сообщения, то есть максимальная длина обычного текстового сообщения, которое будет считаться слишком коротким для классической потоковой передачи зашифрованного текста, поэтому режим цепочки рассматривается как режим потоковой передачи ключей (8-битный CFB). один байт меньше одного блока (не менее 2 блоков, как указано ранее). Полтора блока сообщения все еще может использовать кражу зашифрованного текста для своего метода квантования блока. Полублочное сообщение не может.

Дайте мне больше информации, и я опубликую пример кода о том, как управлять вашим IV на стороне Delphi. Дельфийская сторона шифрует или расшифровывает? Какой режим цепочки вы используете? Какая версия Delphi? Вы контролируете сторону C # или это написано третьей стороной? Sean B. Durkin
Мой вопрос IV связан с тем, что мы должны зашифровать в C # на платформе asp.Net и расшифровать в приложении Delphi Win32. Параметры на обеих платформах должны совпадать. Jan Doggen
Что ты имеешь в виду, что одноразовый номер вставляется в зашифрованный текст? Мне нужен «голый» шифр, чтобы расшифровать его на «другой стороне Jan Doggen
Дельфийская сторона расшифровывает. AES-256 CBC цепочка, заполнение нулями. Сторона C # объединяет IV + зашифрованный текст, base64 его и передает его в качестве параметра веб-службе в Delphi. Код Delphi знает размеры IV и шифра, поэтому он может разбивать их и декодировать. Затем отступы ASCII 0 удаляются, чтобы получить открытый текст. Заполнение делаетн начните с байта в $ 80, как вы написали в своем исходном ответе. Jan Doggen
C # шифрует, у нас есть контроль над этим: MemoryStream ms = new MemoryStream (); AesManaged aes = new AesManaged (); aes.Padding = PaddingMode.Zeros; aes.GenerateIV (); aes.Key = -что-то; currentIV = aes.IV; CryptoStream cs = new CryptoStream (ms, aes.CreateEncryptor (), CryptoStreamMode.Write); cs.Write (входной, 0, входной. Длина); cs.Close (); вернуть ms.ToArray (); Jan Doggen

Похожие вопросы