DCPCrypt/Delphi未正确编码Rijndael
我有DCPCrypt包(最新版本),正在尝试在Delphi2007中使用NIST分发的AES已知答案测试(KAT)向量的测试值进行AES/Rijndael CBC编码(128位块,256位密钥)。一个样本测试向量:DCPCrypt/Delphi未正确编码Rijndael,delphi,aes,rijndael,Delphi,Aes,Rijndael,我有DCPCrypt包(最新版本),正在尝试在Delphi2007中使用NIST分发的AES已知答案测试(KAT)向量的测试值进行AES/Rijndael CBC编码(128位块,256位密钥)。一个样本测试向量: KEY = 0000000000000000000000000000000000000000000000000000000000000000 IV = 00000000000000000000000000000000 PLAINTEXT = 80000000000000000
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');
与
考虑到测试数据的长度,我避免了任何填充问题。
我做错了什么?有什么建议吗
(不,您不必重新计算参数字符串长度-我已经重复了好几次。)Init方法中的密钥大小参数是以位为单位的-如方法注释所述: 根据密钥中的数据进行密钥设置,大小以位为单位 您正在计算KeySize=32位的AES,这是无效的 因此,计算可用的最小密钥大小,即128。返回的值对于128位是正确的-参见第20页 尝试指定256位作为密钥大小:
DCP_rijndael1.Init(KeyBuf,256,@IVBuf);
哦,哇,谢谢你,阿诺!我已经怀疑我忽略了一些小事。我以字节为单位指定了大小;-)
DCP_rijndael1.Init(KeyBuf,256,@IVBuf);