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

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

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

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

Тестовый вектор

  • Шифр = AES-256;
  • Режим цепочки = CBC;
  • Завершение = заполнение нулями в стиле C#;
  • IV передача = полный блок с открытым текстом в зашифрованном виде.
  • Ключ = 33d46cffa158533194214a91e712fc2b45b587076675affd910edeca5f41ac64 little-endien
  • IV = 917fe226df8308f4d96c33304768354a
  • Зашифрованный текст = + kdTGzdV5KZIw8tv466nhQ == (base64)
  • Plaintext = 'a_decent_text' (ansistring)

Спасибо Ян

1 ответ

Решение

а) IV

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

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

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

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

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

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

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

  • Режим ЕЦБ:

Для режима 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;

Некоторые моменты, на которые следует обратить внимание:

  1. Предполагается, что вы предварительно создали TCodec и TCryptographicLibrary (с произвольным именем), вероятно, в форме во время разработки.
  2. Режим цепочки TCodec и другие свойства уже были установлены во время разработки. В случае нашего тестового вектора он должен быть установлен в CBC .
  3. Данный адаптер потока к блоку является специальным и обычно не входит в криптографическую библиотеку. Вот почему есть строка кода для явной регистрации.
  4. Вам потребуется клиент CVS для загрузки последней версии из CVS-хранилища TurboPower LockBox 3. Этот адаптер еще не в официальной стабильной версии.
  5. Используя этот адаптер, вы можете только расшифровать. CSharp-совместимое шифрование пока недоступно. (Дайте мне знать, если вам это нужно раньше, чем позже).
  6. Я проверил это на Delphi 2007 и Delphi 2010. Это работает для меня.

коррекция

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

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