Para probar la implementación de AES 256 voy a utilizar esta función:
procedure AESSwapKey(var Key: TAESKey); var i: Integer; begin for i:= 0 to 7 do begin Key[i]:= ((Key[i] and $000000FF) shl 24) or ((Key[i] and $0000FF00) shl 8) or ((Key[i] and $00FF0000) shr 8) or ((Key[i] and $FF000000) shr 24); end; end; function TestVector(Key, PlainText, CipherText: String): Boolean; var Str: String; P: PByte; AESKey: TAESKey; ExpandedKey: TAESExpandedKey; Src, Dst: TMemoryStream; B: Byte; i: Integer; begin Result:= FALSE; Key:= Copy(Trim(LowerCase(Key)),1,64); while Length(Key) < 64 do Key:= Key + '0'; PlainText:= Trim(LowerCase(PlainText)); while Length(PlainText) mod (Sizeof(TAESState)*2) <> 0 do PlainText:= PlainText + '0'; CipherText:= Trim(LowerCase(CipherText)); Str:= Key; P:= @AESKey[0]; while Str <> EmptyStr do begin P^:= StrToInt('$'+Copy(Str,1,2)); delete(Str,1,2); inc(P); end; // Invierte el orden de los bytes para ajustarse a los vectores de prueba AESSwapKey(AESKey); AEsExpandKey(ExpandedKey,AESKey); Src:= TMemoryStream.Create; Dst:= TMemoryStream.Create; try Str:= PlainText; while Str <> EmptyStr do begin B:= StrToInt('$'+Copy(Str,1,2)); Src.WriteBuffer(B,1); delete(Str,1,2); end; Src.Position:= 0; AESEncryptStreamECB(Src,Dst,ExpandedKey); P:= Dst.Memory; Str:= EmptyStr; for i:= 1 to Dst.Size do begin Str:= Str + LowerCase(Inttohex(P^,2)); inc(P); end; Result:= Str = CipherText; finally Src.Free; Dst.Free; end; end;
Aquí tenemos algunos vectores de prueba:
KEY: 603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4 PLAINTEXT CIPHERTEXT 6bc1bee22e409f96e93d7e117393172a f3eed1bdb5d2a03c064b5a7e3db181f8 ae2d8a571e03ac9c9eb76fac45af8e51 591ccb10d410ed26dc5ba74a31362870 30c81c46a35ce411e5fbc1191a0a52ef b6ed21b99ca6f4f9f153e7b1beafed1d f69f2445df4f9b17ad2b417be66c3710 23304b7a39f9f3ff067d8d8f9e24ecc7
Por ejemplo, esto debería mostrar el mensaje "TRUE"
ShowMessage(BoolToStr(( TestVector( '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4', '6bc1bee22e409f96e93d7e117393172a', 'f3eed1bdb5d2a03c064b5a7e3db181f8')),TRUE));
Se pueden encontrar mas vectores de prueba en la pagina oficial:
http://csrc.nist.gov/groups/STM/cavp/documents/aes/KAT_AES.zip
Estupendo, siempre estoy
Estupendo, siempre estoy pendiente por si te dejas caer por aquí con algo de código interesante.
Saludos.
Hola amigo. Siempre me ha
Hola amigo.
Siempre me ha interesado cada una de tus publicaciones y esta no es la excepción, ya veremos como lo implementamos en algún proyecto. Como siempre por supuesto. ;)
Salud OS
Enviar un comentario nuevo