Ver Mensaje Individual
  #3  
Antiguo 25-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Bueno, como decía antes, en este otro algoritmo desordenamos las lineas. Se diferencia de los anteriores es que toda la información sigue ahí, así que funciones como el histograma devolverían el mismo resultado en la imagen original y en la encriptada. La desventaja es que al igual que hacen los decodificadores pirata de televisión, aplicando un análisis estadístico se puede llegar a recomponer la imagen, aun sin saber la contraseña.

Código Delphi [-]
procedure Cifrar(Imagen: TPicture; Clave: Longint);
var
  Bitmap: TBitmap;
  P1, P2: ^Triple;
  i, j, k: Integer;
  Temp: Triple;
  Sec: Array of Integer;
begin
  RandSeed:= Clave;
  if not (Imagen.Graphic is TBitmap) then
  begin
    Bitmap:= TBitmap.Create;
    try
      Bitmap.Width:= Imagen.Width;
      Bitmap.Height:= Imagen.Height;
      Bitmap.Canvas.Draw(0,0,Imagen.Graphic);
      Imagen.Assign(Bitmap);
    finally
      Bitmap.Free;
    end;
  end;
  Imagen.Bitmap.PixelFormat:= pf24bit;
  SetLength(Sec,Imagen.Bitmap.Height div 2);
  for i:= 0 to High(Sec) do
    Sec[i]:= Length(Sec) + i;
  for i:= 0 to High(Sec) do
  begin
    k:= Sec[i];
    j:= Random(High(Sec));
    Sec[i]:= Sec[j];
    Sec[j]:= k;
  end;
  for j:= 0 to High(Sec) do
  begin
    P1:= Imagen.Bitmap.ScanLine[j];
    P2:= Imagen.Bitmap.ScanLine[Sec[j]];
    for i:= 0 to Imagen.Bitmap.Width - 1 do
    begin
      Temp:= P1^;
      P1^:= P2^;
      P2^:= Temp;
      inc(P1); inc(P2);
    end;
  end;
end;

// El ejemplo de siempre
  Cifrar(Image1.Picture,1978);
  Image1.Refresh;
Responder Con Cita