Ir al contenido


Foto

Dudas con el artículo de Seoane Cifrar texto con AES-256


  • Por favor identifícate para responder
3 respuestas en este tema

#1 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 16 marzo 2014 - 07:55

Hola amigos,

Pues eso. Estoy usando las librerías del compañero Seoane que amablemente menciona en su blog. Pero tengo algunas dudas. Al querer usar las funciones de su artículo:
Cifrar texto con AES-256 pues me han aparecido errores en estas dos funciones:
AESEncryptStreamECB(Src,Dst,ExpandedKey);
AESDecryptStreamECB(Src,Dst,ExpandedKey);

Pues no existen según pude ver en la unidad AES de su libería. De ahí mi duda. ¿Esas funciones estan en alguna otra librería o se deben reescribir?

Saludos amigos,.
  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 17 marzo 2014 - 04:16

Caramba, ese articulo es del año 2007, en aquel momento todavía no había comenzado el proyecto SeCrypt y la unit "AES.pas" poco se parece a la unit "SeAES256.pas" actual.

Pero mira que casualidad, precisamente ayer subí una nueva versión  de la librería a la que le añadí una nueva unit "SeEasyAES.pas" que simplifica muchisimo el proceso de cifrar/descifrar dejando que ella se preocupe del método de cifrado, generación de contraseña y vector de inicialización, nosotros solamente le tenemos que dar el texto y el password y el nos devuelve el texto cifrado, y viceversa.

Se pueden descargar de aquí (la ultima versión es la 0.4):
https://drive.google...OWM&usp=sharing

En ella encontraras un ejemplo como este (test03.dpr)


delphi
  1. program test03;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils,
  7.   SeAES256 in '..\SeCrypt\SeAES256.pas',
  8.   SeBase64 in '..\SeCrypt\SeBase64.pas',
  9.   SeEasyAES in '..\SeCrypt\SeEasyAES.pas',
  10.   SeSHA256 in '..\SeCrypt\SeSHA256.pas',
  11.   SeStreams in '..\SeCrypt\SeStreams.pas';
  12.  
  13. var
  14.   i: Integer;
  15.   Src, Cifrado: WideString;
  16. begin
  17.   try
  18.     Randomize;
  19.     for i:= 1 to 1000 do
  20.       Src:= Src + Chr(Random(1 + Ord('z') - Ord('A')) + Ord('A'));
  21.     Writeln('=== Texto sin cifrar ===');
  22.     Writeln(Src);
  23.     Writeln;
  24.     Cifrado:= EasyAESEnc(Src,'Clave');
  25.     Writeln('=== Texto cifrado ===');
  26.     Writeln(Cifrado);
  27.     Writeln;
  28.     Cifrado:= EasyAESDec(Cifrado,'Clave');
  29.     Writeln('=== Texto descifrado ===');
  30.     Writeln(Cifrado);
  31.     Writeln;
  32.     Writeln('Resultado = ' + BoolToStr(Src = Cifrado,TRUE));
  33.     Writeln;
  34.   except
  35.     On E: Exception do
  36.       Writeln(E.Message);
  37.   end;
  38.   Readln;
  39. end.



Como puedes ver todo se reduce a las funciones EasyAESEnc y EasyAESDec. Existen varias versiones de estas funciones que nos permiten trabajar con Strings (WideStrings en realidad), Streams o ficheros:


delphi
  1. // Genera una "key" de 256 bits a partir de una cadena de texto
  2. procedure EasyGenKey(var Key: TAESKey; Password: WideString);
  3. // Streams
  4. procedure EasyAESEnc(Src, Dst: TStream; Password: WideString); overload;
  5. procedure EasyAESDec(Src, Dst: TStream; Password: WideString); overload;
  6. // Strings
  7. function EasyAESEnc(Str, Password: WideString): WideString; overload;
  8. function EasyAESDec(Str, Password: WideString): WideString; overload;
  9. // Ficheros
  10. procedure EasyAESEnc(SrcFile, DstFile, Password: WideString); overload;
  11. procedure EasyAESDec(SrcFile, DstFile, Password: WideString); overload;



Espero que con estas funciones se simplifique mucho el uso de AES para aquellos en que el método de cifrado, tamaño de clave, etc ... les trae sin cuidado, y solo quieren cifrar algo.

Por cierto, las funciones generan un IV aleatorio por lo que si cifras el mismo texto en dos ocasiones la segunda vez da un resultado diferente de de la primera, aunque los dos devuelven el mismo texto al descifrar, es decir:


delphi
  1. // Lo siguiente siempre devuelve FALSE
  2. Writeln(BoolToStr(EasyAESEnc('Texto en claro','Clave')=EasyAESEnc('Texto en claro','Clave'),TRUE));
  3. // Y lo siguiente siempre devuleve TRUE
  4. Writeln(BoolToStr(EasyAESDec(EasyAESEnc('Texto en claro','Clave'),'Clave')=EasyAESDec(EasyAESEnc('Texto en claro','Clave'),'Clave'),TRUE));



Saludos





  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 18 marzo 2014 - 09:01

Je, me bajé la última versión de tu libería amigo pero por no revisar bien no encontré eso así que me puse a buscar en tu blog y encontré las funciones que me hacian falta y pude hacer funcionar el ejemplo.

Pero me actualizaré con al info que me has dado. Gracias por el trabajo que has hecho, me está siendo de mucha ayuda.
  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 19 marzo 2014 - 03:49

Gracias por el trabajo que has hecho, me está siendo de mucha ayuda.


Encantado de ayudar. Y si tienes alguna sugerencia o encuentras algún fallo no dudes en decírmelo
  • 0




IP.Board spam blocked by CleanTalk.