DCPCrypt / Delphi неправильно кодирует Rijndael - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть пакет DCPCrypt (последняя версия), и я пытаюсь выполнить кодировку AES / Rijndael CBC (128-битные блоки, 256-битный ключ) в Delphi2007 с помощью тестовых значений из векторов AES Known Answer Test (KAT), распространяемых NIST.Один пример тестового вектора:

KEY = 0000000000000000000000000000000000000000000000000000000000000000  
IV = 00000000000000000000000000000000  
PLAINTEXT = 80000000000000000000000000000000  
CIPHERTEXT = ddc6bf790c15760d8d9aeb6f9a75fd4e

Код, приведенный ниже, возвращает:

Cyphertext (bytes): 58 215 142 114 108 30 192 43 126 191 233 43 35 217 236 52  
Cyphertext (hex): 3AD78E726C1EC02B7EBFE92B23D9EC34  
Cyphertext (base64): OteOcmwewCt+v+krI9nsNA==  

, что, очевидно, неверно.

procedure TFrmKATVectors.TestData(Key,IV,PlainText: String);  
var  
  InBuf,OutBuf: TestBuffer;  
  KeyBuf: KeyBuffer;  
  IVBuf: IVBuffer;  
  l,i: Integer;  
  Bytes,  
  SOut: String;  
begin  
  Memo1.Lines.Add('Key: ' + Key);  
  Memo1.Lines.Add('IV: ' + IV);  
  Memo1.Lines.Add('Plaintext: ' + Plaintext);  
  l := Length(Key) DIV 2;  
  for i := 1 to l do KeyBuf[i] := HexToInt(Copy(Key,2*(i-1)+1,2));  
  l := Length(IV) DIV 2;  
  for i := 1 to l do IVBuf[i] := HexToInt(Copy(IV,2*(i-1)+1,2));  
  l := Length(PlainText) DIV 2;  
  for i := 1 to l do InBuf[i] := HexToInt(Copy(PlainText,2*(i-1)+1,2));  
  DCP_rijndael1.Init(KeyBuf,32,@IVBuf);  
  DCP_rijndael1.EncryptCBC(InBuf,OutBuf,TestBufSize);  
  SOut := '';  
  for i := 1 to Length(OutBuf) do
   begin
     SOut := SOut + Chr(OutBuf[i]);
     Bytes := Bytes + IntToStr(OutBuf[i]) + ' ';
   end;  
  Memo1.Lines.Add('Cyphertext (bytes): ' + Bytes); 
  Memo1.Lines.Add('Cyphertext (hex): ' + StringToHex(SOut));  
  Memo1.Lines.Add('Cyphertext (base64): ' + Base64EncodeStr(SOut));  
  Memo1.Lines.Add('');  
end;

Я звоню

TestData('0000000000000000000000000000000000000000000000000000000000000000',
         '00000000000000000000000000000000', '80000000000000000000000000000000');

с

const
TestBufSize = 16;

type  
TestBuffer = packed Array[1..TestBufSize] of Byte;  
KeyBuffer = packed Array[1..32] of Byte;  
IVBuffer = packed Array[1..16] of Byte;  

Учитывая длину моих тестовых данных, я избегаю каких-либо проблем с заполнением.Что я делаю неправильно?Любые предложения?

(Нет, вам не нужно пересчитывать длину строки параметра - я делал это несколько раз.)

1 Ответ

7 голосов
/ 29 ноября 2011

Параметр размера ключа в методе Init указан в битах - как указано в комментарии метода:

Выполнить настройку ключа на основе данных в ключе, размер указан в битах

Вы вычисляете AES с KeySize = 32 бита, что недопустимо.

Таким образом, вы вычисляете для наименьшего доступного размера ключа, равного 128. Возвращаемое значение корректно для 128 бит- см. http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf стр. 20.

Попробуйте указать 256 бит в качестве размера ключа:

 DCP_rijndael1.Init(KeyBuf,256,@IVBuf);  
...