?? encryption.m
字號:
clear all;
Image=double(imread('e:\work\lena.jpg'));
figure(1)
subplot(2,2,1)
imshow(Image,[]);%顯示原始圖像
title('原始圖像');
Image=uint8(Image);
figure(1)
subplot(2,2,2)
imhist(Image);
title('原始圖像的直方圖');
Ih=size(Image,1);%圖像的長度
Iw=size(Image,2);%圖像的寬度
key=double(input('請輸入加密密鑰:','s'));%輸入任意位密鑰,為安全起見,密鑰長度不得少于四位
len=length(key);
while(mod(len,4)~=0)%密鑰位數(shù)不是4的倍數(shù)則程序自動取固定值補足末幾位
len=len+1;
key(len)=15;%程序自動補足默認值為15
end
N=len/4;%四個密鑰為一組,共N組
for(i=1:Ih)
for(j=1:Iw)
Imagebak(i,j)=Image(i,j);
end
end
for(n=1:N)
select=mod(key((n-1)*4+1),4);%四種參數(shù)取法,每種取法有兩個獨立參數(shù)
switch(select)
case 0
a=1;
b=mod(key((n-1)*4+2),Ih);
c=mod(key((n-1)*4+3),Ih);
d=mod((b*c+1),Ih);
case 1
a=mod(key((n-1)*4+2),Ih);
b=1;
c=mod(a*mod(key((n-1)*4+3),Ih)-1,Ih);
d=mod(key((n-1)*4+3),Ih);
case 2
a=mod(key((n-1)*4+2),Ih);
b=mod(a*mod(key((n-1)*4+3),Ih)-1,Ih);
c=1;
d=mod(key((n-1)*4+3),Ih);
case 3
a=mod(key((n-1)*4+2),Ih)*mod(key((n-1)*4+3),Ih);
b=mod(key((n-1)*4+2),Ih);
c=mod(key((n-1)*4+3),Ih);
d=1;
end%這四種取法使貓映射為保面積映射,即映射矩陣行列式為1
iterative=mod(key((n-1)*4+4),17);%每組迭代次數(shù)
if(iterative<10)
iterative=iterative+10;%為防止迭代次數(shù)過多或過少,取模17后的值,但若小于10則要加上10
end
for(i=1:Ih)
for(j=1:Iw)
absc=i;
ordi=j;
for(k=1:iterative)
absc1=mod((a*absc+b*ordi),Ih)+1;
ordi1=mod((c*absc+d*ordi),Iw)+1;
absc=absc1;
ordi=ordi1;
% imagebak[i][j]=(image[i][j]+G*abs(absc-ordi))%256;
end
Enimage(absc1,ordi1)=Imagebak(i,j);
end
end
for(i=1:Ih)
for(j=1:Iw)
Imagebak(i,j)=Enimage(i,j);
end
end
end
figure(1)
subplot(2,2,3)
imshow(Enimage,[]);
title('加密圖像');
figure(1)
subplot(2,2,4)
imhist(Enimage);
title('加密圖像的直方圖');
Enimage=uint8(Enimage);
imwrite(Enimage,'Entest.bmp','bmp');
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -