Probando mi implementación de AES 256

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

El contenido de este campo se mantiene privado y no se mostrará públicamente.