十万火急!满意者送50分!(100分)

  • 主题发起人 主题发起人 zhyan2001
  • 开始时间 开始时间
Z

zhyan2001

Unregistered / Unconfirmed
GUEST, unregistred user!
问题应该不难,可结果总是不太对。我想对一幅图采用简单的异或运算加密,方法是对
每一象素与随机产生的整数做异或,然后再把密图与产生的整数异或得到原图。
a:=random(16777215);
b:=random(16777215);
for i:=0 to width-1 do
for j:=0 to hight-1 do
begin
Canvas.Pixels[i,j]:=Canvas.Pixels[i,j] xor (x[(a*i+b*j) mod di]);
end;
for i:=0 to width-1 do
for j:=0 to hight-1 do
begin
Canvas.Pixels[i,j]:=Canvas.Pixels[i,j] xor (x[(a*i+b*j) mod di]);
end;
得到的图上有很多麻点,我循环了4次,麻点更多。
另外我还采用了分别对RGB分量异或后再合成的办法,得到的图像更糟,象原图的水彩画。
for i:=0 to wj-1 do
for j:=0 to hi-1 do
begin
k[hi*i+j]:=Canvas.Pixels[i,j];
blue[hi*i+j]:=getbvalue(k[hi*i+j]);
blue[hi*i+j]:=blue[hi*i+j] xor e;
green[hi*i+j]:=getgvalue(k[hi*j+i]);
green[hi*i+j]:=green[hi*i+j] xor e;
red[hi*i+j]:=getrvalue(k[hi*i+j]);
red[hi*i+j]:=red[hi*i+j] xor e;
Canvas.Pixels[i,j]:=rgb(red[hi*i+j],green[hi*i+j],blue[hi*i+j]);
end;
谁能帮帮我!
 
很简单, 因为异或后得到的Pixel并不就一定是两个整数异或的值, 而是系统根据当前
显示支持的颜色进行调整后的值. 再次异或当然会产生误差.
 
这么说用异或的办法行不通,还是异或整数不行?系统怎么调整的,干嘛调整?
 
我试了下,和数组x的取值有关。
若x大于$FFFFFF则不能还原。
小于就OK :)

const
di: integer=8;
x: array[0..7] of Integer=($FFFFFF,200,300,400,500,600,700,800);
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: Integer;
begin
a:=random(16777215);
b:=random(16777215);
for i:=0 to Image1.Width - 1 do
for j:=0 to Image1.Height - 1 do
Image1.Canvas.Pixels[i,j]:=Image1.Canvas.Pixels[i,j] xor
(x[(a*i+b*j) mod di]);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i, j: Integer;
begin
for i:=0 to Image1.Width - 1 do
for j:=0 to Image1.Height - 1 do
Image1.Canvas.Pixels[i,j]:=Image1.Canvas.Pixels[i,j] xor
(x[(a*i+b*j) mod di]);
end;
 
试过了,一次好点,循环四次后恢复就有许多麻点了,而且我原来di〉〉8,因为8的加密效果
不好,还能看出点影子!
 
把它当作普通文件来加密,或是自定义压缩的话,哪用考虑那么多?
如果是简单的改变每个像素的颜色的话,总是可以依稀看见图象的轮廓的。
 
加密
Var bh,bhKey:Windows.Tbitmap;
X,Y:Integer;
Psrc,Pkey:^Byte;
Begin
Image.Picture.Bitmap.HandleType:=bmDIB;
ImageKey.Picture.Bitmap.Assign(Image.Picture.Bitmap);
GetObject(Image.Picture.Bitmap.Handle,Sizeof(bh),@bh) ;
Psrc:=bh.bmbits;
GetObject(ImageKey.Picture.Bitmap.Handle,Sizeof(bh2),@bh2) ;
Pkey:=bh2.bmbits; RandSeed:=GetTickCount;
For Y:=0 to bh.bmheight-1 do
For X:=0 to bh.bmwidthbytes-1 do
Begin
Pkey^:=Random(255) XOR Psrc^;
Inc(Pkey);Inc(Psrc);
End;
Image.Refresh;
Image.Picture.Bitmap.SavetoFile('.....');
ImageKey.Picture.Bitmap.SavetoFile('....Key');
End;

反加密
Var bh,bhKey:Windows.Tbitmap;
X,Y:Integer;
Psrc,Pkey:^Byte;
Begin
Image.Picture.Bitmap.LoadFromFile('.......');
GetObject(Image.Picture.Bitmap.Handle,Sizeof(bh),@bh) ;
Psrc:=bh.bmbits;
ImageKey.Picture.Bitmap.LoadFromFile('.......');
GetObject(ImageKey.Picture.Bitmap.Handle,Sizeof(bh2),@bh2) ;
Pkey:=bh2.bmbits;
For Y:=0 to bh.bmheight-1 do
For X:=0 to bh.bmwidthbytes-1 do
Begin
PSrc^:=PKey^ XOR Psrc^;
Inc(Pkey);Inc(Psrc);
End;
Image.Refresh;
End;



 
不好意思 笔误:
加密方法更正如下:

Var bh,bhKey:Windows.Tbitmap;
X,Y:Integer;
Psrc,Pkey:^Byte;
Begin
Image.Picture.Bitmap.HandleType:=bmDIB;
ImageKey.Picture.Bitmap.Assign(Image.Picture.Bitmap);
GetObject(Image.Picture.Bitmap.Handle,Sizeof(bh),@bh) ;
Psrc:=bh.bmbits;
GetObject(ImageKey.Picture.Bitmap.Handle,Sizeof(bhKey),@bhKey) ;
Pkey:=bhKey.bmbits; RandSeed:=GetTickCount;
For Y:=0 to bh.bmheight-1 do
For X:=0 to bh.bmwidthbytes-1 do
Begin
Pkey^:=Random(255);
PSrc^:=PKey^ XOR Psrc^;
Inc(Pkey);Inc(Psrc);
End;
Image.Refresh;
Image.Picture.Bitmap.SavetoFile('.....');
ImageKey.Picture.Bitmap.SavetoFile('....Key');
End;

 
多人接受答案了。
 
后退
顶部