Cifrar texto con AES-256 en freepascal

Siguiendo con el tema del cifrado AES256 he decidido probar el código en freepascal, sobre linux. La mayor parte del código lo he podido usar sin problemas, una vez que en la opciones del compilador he colocado que tiene que ser "compatible con Delphi", pero he tenido que prescindir de mi unit base64, que solo funciona en windows, y conformarme con representar el texto cifrado en hexadecimal.

El único cambio que tuve que realizar en el resto de las units fue anadir la directiva $ASMMODE en la unit SHA256 para que las funciones en ensamblador pudieran compilarse sin problemas.

{$ASMMODE intel}     
function ror(x: Cardinal; y: Byte): Cardinal; assembler;

El codigo de prueba que he utilizado es el siguiente:

program AEStest;
 
uses Sysutils,Classes,AES,SHA256;
 
function Cifrar(Str,Clave: AnsiString): AnsiString;
var
  Src: TStringStream;
  Dst: TMemoryStream;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Dst:= TMemoryStream.Create;
  try
    // Usamos como Key el hash SHA256 de la Clave
    TSHA256HASH(Key):= CalcSHA256(Clave);
    AEsExpandKey(ExpandedKey,Key);
    Src:= TStringStream.Create(Str);
    try
      Src.Position:= 0;
      AESEncryptStreamECB(Src,Dst,ExpandedKey);
    finally
      Src.Free;
    end;
    SetLength(Result,Dst.Size * 2);
    BinToHex(Dst.Memory,PAnsiChar(Result),Dst.Size);
  finally
    Dst.Free;
  end;
end;
 
function Descifrar(Str,Clave: AnsiString): AnsiString;
var
  Src: TMemoryStream;
  Dst: TStringStream;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TMemoryStream.Create;
  Dst:= TStringStream.Create(EmptyStr);
  try
    Src.Size:= Length(Str) div 2;
    Src.Size:= HexToBin(PAnsiChar(Str),Src.Memory,Src.Size);
    Src.Position:= 0;
    TSHA256HASH(Key):= CalcSHA256(Clave);
    AEsExpandKey(ExpandedKey,Key);
    AESDecryptStreamECB(Src,Dst,ExpandedKey);
    Result:= Trim(Dst.DataString);
  finally
    Src.Free;
    Dst.Free;
  end;
end;
 
var
  Tmp: String;
begin
  Tmp:= Cifrar('Hola mundo','123');
  Writeln(Tmp);
  Writeln(Descifrar(Tmp,'123'));
end.

Enlaces de interes:
Cifrar texto con AES-256 (Segunda parte) - http://delphi.jmrds.com/?q=node/65
Cifrar texto con AES-256 - http://delphi.jmrds.com/?q=node/44
Cifrado AES-256 - http://delphi.jmrds.com/?q=node/31
Calcular el hash SHA256 de un texto - http://delphi.jmrds.com/?q=node/64

Añadir nuevo comentario