Encriptar/Desencriptar JPGs  

Enviado Por: Radikal (Q3 Team)
Web : http://www.q3.nu
Email: radikal@q3.nu
Fecha: 20/08/20

Truco accedido 188 veces

 


A veces, nuestros programas usan imágenes JPEG, como por ejemplo nuestro logo, o cosas así, y una de las cosas que a uno le preocupa es ¿y si alguno me cambia el logo?.
Para evitarlo, guardaremos nuestros JPGs encriptados, y los desencriptaremos en el momento de cargarlos.

Para esto, aqui tienes dos funciones, una que encripta un fichero JPG cualquiera con una clave cualquiera (que llamada dos veces sobre el mismo fichero tambien serviría para desencriptar el fichero), y otra, que nos permitirá cargar un JPG encriptado en un TImage cualquiera de nuestra form.

Para probar este ejemplo necesitas:

  • Añadir Jpeg al uses de tu form

  • Dos TButtons en una form (Button1 y Button2)

  • Un TImage (Image1)



Y añadir estos códigos a los eventos OnClick de los botones.
El Button1 encriptará un bitmap (en el ejemplo llamado Foto.JPG, y el fichero resultante sera llamado FotoEnc.jpg) y el Button2 cargará ese bitmap (el encriptado, osea el FotoEnc.jpg) en nuestro Image1.

OJO: Ninguna de las dos funciones detecta si los ficheros existen, eso es cosa tuya...

 procedure TForm1.Button1Click(Sender: TObject);

   procedure EncriptaJPG(Ori,Dest: string; Clave:integer);
   { Ori: Nombre del fichero original (Source filename)
     Dest: Nombre del fichero encriptado (Destination filename) }

   const
     MAXBUFFER        = 4096;  //4k de buffer;
   var
     Buffer           : array[1..MAXBUFFER] of byte;
     Origen, Destino  : TFileStream;
     n, Leidos        : integer;
   begin
     Origen  :=TFileStream.Create(Ori,fmOpenRead+fmShareDenyWrite);
     Destino :=TFileStream.Create(Dest,fmCreate);
     RandSeed:=Clave;
     try
       repeat
         Leidos:=Origen.Read( Buffer[1],MAXBUFFER );
         for n:=1 to Leidos do begin
           Buffer[n]:=Buffer[n] XOR Random(256);
         end;
         Destino.Write(Buffer[1],Leidos);
       until (Leidos < MAXBUFFER);
     finally
       Origen.Free;
       Destino.Free;
     end;
   end;

 begin
   EncriptaJPG('Foto.jpg','FotoEnc.jpg',666);
 end;




 procedure TForm1.Button2Click(Sender: TObject);

   procedure CargaJpgEncriptado(Nombre: string;Imagen: TImage;Clave:integer);
   // uses jpeg;
   type
     ByteBuffer       = array[0..9999999] of Byte;
   var
     PByteBuffer      : ^ByteBuffer;
     Origen           : TMemoryStream;
     n                : integer;
     JPGTemp          : TJPegImage;
   begin
     Origen:=TMemoryStream.Create;
     JPGTemp:=TJPegImage.Create;

     try
       Origen.LoadFromFile(Nombre);

       RandSeed:=Clave;
       PByteBuffer:=Origen.Memory;
       for n:=0 to Origen.Size do begin
         PByteBuffer^[n]:=(PByteBuffer^[n] xor Random(256));
       end;

       Origen.Seek(0,soFromBeginning);
       JPGTemp.LoadFromStream(Origen);

       Image1.Picture.Bitmap.Assign(JPGTemp);
     finally
       Origen.Free;
       JPGTemp.Free;
     end;
   end;
 begin
   CargaJpgEncriptado('FotoEnc.jpg',Image1,666);
 end;




Actualizado el 20/08/2005 Gracias a Jorge por la traducción)