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