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;
Некоторые моменты, на которые следует обратить внимание:
- Предполагается, что вы предварительно создали TCodec и TCryptographicLibrary (с произвольным именем), вероятно, в форме во время разработки.
- Режим цепочки TCodec и другие свойства уже были установлены во время разработки. В случае нашего тестового вектора он должен быть установлен в CBC .
- Данный адаптер потока к блоку является специальным и обычно не входит в криптографическую библиотеку. Вот почему есть строка кода для явной регистрации.
- Вам потребуется клиент CVS для загрузки последней версии из CVS-хранилища TurboPower LockBox 3. Этот адаптер еще не в официальной стабильной версии.
- Используя этот адаптер, вы можете только расшифровать. CSharp-совместимое шифрование пока недоступно. (Дайте мне знать, если вам это нужно раньше, чем позже).
- Я проверил это на Delphi 2007 и Delphi 2010. Это работает для меня.
коррекция
Максимальная длина короткого сообщения, то есть максимальная длина обычного текстового сообщения, которое будет считаться слишком коротким для классической потоковой передачи зашифрованного текста, и поэтому режим цепочки рассматривается как режим потоковой передачи ключей (8-битный CFB), равен единице. байт менее одного блока (не менее 2 блоков, как указано ранее). Полтора сообщения блока все еще могут использовать кражу зашифрованного текста для своего метода квантования блока. Полублочное сообщение не может.