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;
Cifrar(Image1.Picture,1978);
Image1.Refresh;