Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2007
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Post Consulta!

Buenos días:

Revivo este hilo para saber si es posible usar esta implementación para poder encriptar y desencriptar cadenas de texto string. Hay multiples componentes que lo hacen, pero la idea es usar esta unit que ha implementado domingo, simple y concreta y sin necesidad de utilizar grandes paquetes de componentes.

Muchas Gracias!!!!
__________________
Saludos.

Marcelo D. Alegre
Responder Con Cita
  #2  
Antiguo 08-11-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por kanvictor Ver Mensaje
Revivo este hilo para saber si es posible usar esta implementación para poder encriptar y desencriptar cadenas de texto string.
Pues a primera vista no veo porque no, fíjate que la función admite como parámetros dos streams (Source y Dest), estos pueden ser por ejemplo un TStringStream y un TMemoryStream. El único problema que veo es que la información cifrada (la de stream Dest) no se puede representar como texto. Pero si te das una vueltita por mi pagina encontraras una función que permite codificar un stream a base64, devolviendo una cadena de texto.

En resumen, el proceso seria el siguiente:

-- Para cifrar --
- Cargar el texto en un TStringStream
- Cifrarlo, quedando el resultado en un TMemoryStream
- Codificar el TMemoryStream a base64

-- Para descifrar --
- Descodificar el texto en base64, quedando el resultado en un TMemoryStream
- Descifrarlo, quedando el resultado en un TStringStream
- Obtener el texto en claro del TStreamStream.

No lo he probado, pero debería de funcionar

Algunos links
http://delphi.jmrds.com/?q=node/43
http://delphi.jmrds.com/?q=node/31
Responder Con Cita
  #3  
Antiguo 08-11-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Y para que no digais que falta el codigo, y aunque ando un poco apurado ...

Código Delphi [-]
uses AES, Base64;

function Cifrar(Str,Clave: String): String;
var
  Src: TStringStream;
  Dst: TMemoryStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TStringStream.Create(Str);
  try
    Dst:= TMemoryStream.Create;
    try
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AEsExpandKey(ExpandedKey,Key);
      // Guardamos el tamaño del archivo
      Size:= Src.Size;
      Dst.WriteBuffer(Size,Sizeof(Size));
      AESEncryptStreamECB(Src,Dst,ExpandedKey);
      Result:= BinToStr(Dst.Memory,Dst.Size);
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

function Descifrar(Str,Clave: String): String;
var
  Src: TMemoryStream;
  Dst: TStringStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TMemoryStream.Create;
  try
    Dst:= TStringStream.Create(Str);
    try
      StrToStream(Str,Src);
      Src.Position:= 0;
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AESExpandKey(ExpandedKey,Key);
      // Guardamos el tamaño del archivo
      Src.ReadBuffer(Size,Sizeof(Size));
      AESDecryptStreamECB(Src,Dst,ExpandedKey);
      Dst.Size:= Size;
      Result:= Dst.DataString;
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

// Ejemplo
ShowMessage(Descifrar(Cifrar('Hola mundo','1234'),'1234'));
Responder Con Cita
  #4  
Antiguo 12-11-2007
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Smile Gracias!!

Domingo, sin palabras!! sos un grande!!

Muchas gracias.-
__________________
Saludos.

Marcelo D. Alegre
Responder Con Cita
  #5  
Antiguo 12-11-2007
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Post Un solo Inconveniente:

Sucede que uso Windows 2000. Por lo que se ve, en windows 2000 la crypt32.dll no tiene los metodos:
CryptBinaryToStringA
CryptStringToBinaryA

Por lo tanto baje la libreria nueva desde la web y la use sin problemas (creo)
Dado que puedo Cifrar texto sin problemas.

Sin embargo, al descifrar (no creo que tenga que ver con que uso la libreria por separado, lo digo por el error...) se produce una excepcion de "Stream read error", donde al debugear, el problema se da en la linea que tiene este codigo:
Código Delphi [-]
  Src.ReadBuffer(Size,Sizeof(Size));

la prueba la estoy haciendo llamando a la funcion de la siguiente manera:
edit1.text:=Descifrar('hola','1234');

Alguna idea de que me puede estar afectando?

Muchas gracias!!!
__________________
Saludos.

Marcelo D. Alegre
Responder Con Cita
  #6  
Antiguo 12-11-2007
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Post

Retiro lo dicho. Todo funciona correctamente!!!.

De nuevo gracias Domingo, me diste una mano grande.

Saludos.
__________________
Saludos.

Marcelo D. Alegre
Responder Con Cita
  #7  
Antiguo 12-11-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Pues no me había fijado en el detalle de que en Windows 2000 no funcionaba, ahora mismo actualizo la web indicando que se necesita Windows XP como mínimo. Gracias kanvictor

Por otro lado, el error que te daba era debido a que estabas intentando descifrar una cadena de texto ("hola") que no había sido cifrada. Así es normal que te diera un error , pero quizá seria interesante que incluyas la función dentro de un bloque "try except" para capturar este tipo de errores.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
HTTP ¿cifrado? N.P.I lag_0 Internet 3 13-04-2007 09:04:29
Un hombre demanda a Microsoft: el FBI accedió a su disco duro... cifrado marcoszorrilla La Taberna 6 06-03-2007 20:35:03
Disco de cifrado Casero (Especial para los aburridos pensadores de los últimos días) Neftali [Germán.Estévez] Noticias 0 22-11-2006 11:05:00
Cifrado de password... dunia_lv MS SQL Server 2 08-08-2006 22:06:18


La franja horaria es GMT +2. Ahora son las 06:52:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi