clear;close;
disp('请输入密钥:');
x(1)=input('请输入第一个密钥: ');
y(1)=input('请输入第二个密钥: ');
z(1)=input('请输入第三个密钥: ');
disp('加密中...');
f=imread('test2.bmp'); %读取图像
[M,N]=size(f);
N=N/3;
sigma=10;r=28;b=8/3; %三维的lorenz混沌映射生成混沌序列
[x,y,z]=lorentz(M*N,0,sigma,r,b,x(1),y(1),z(1),0.01);
[m1,num1]=sort(x); %混沌序列升序排列以及生成位置矩阵
[m2,num2]=sort(y);
[m3,num3]=sort(z);
fr=f(:,:,1); %图像的R分量矩阵
fg=f(:,:,2); %图像的G分量矩阵
fb=f(:,:,3); %图像的B分量矩阵
ff1r=uint8(zeros(M,N));
ff1g=uint8(zeros(M,N));
ff1b=uint8(zeros(M,N));
ff2r=uint8(zeros(M,N));
ff2g=uint8(zeros(M,N));
ff2b=uint8(zeros(M,N));
ffr=uint8(zeros(M,N));
ffg=uint8(zeros(M,N));
ffb=uint8(zeros(M,N));
m1=mod(1000*m1,256); %混沌序列转为二进制
m1=uint8(m1);
m2=mod(1000*m2,256);
m2=uint8(m2);
m3=mod(1000*m3,256);
m3=uint8(m3);
for i=1:M*N %加密
ff1r(i)=fr(num1(i)); %位置置乱
ff1g(i)=fg(num2(i));
ff1b(i)=fb(num3(i));
ffr(i)=bitxor(ff1r(i),m1(i)); %改变像素值
ffg(i)=bitxor(ff1g(i),m2(i));
ffb(i)=bitxor(ff1b(i),m3(i));
end
ff(:,:,1)=ffr;ff(:,:,2)=ffg;ff(:,:,3)=ffb; %生成加密图像
imshow(ff);title('加密图像');
fffr=uint8(zeros(M,N));
fffg=uint8(zeros(M,N));
fffb=uint8(zeros(M,N));
for i=1:M*N %解密
ff2r(i)=bitxor(ffr(i),m1(i)); %生成原图像像素值
ff2g(i)=bitxor(ffg(i),m2(i));
ff2b(i)=bitxor(ffb(i),m3(i));
fffr(num1(i))=ff2r(i); %改变位置到原来的位置
fffg(num2(i))=ff2g(i);
fffb(num3(i))=ff2b(i);
end
fff(:,:,1)=fffr;fff(:,:,2)=fffg;fff(:,:,3)=fffb; %生成解密图像
figure
imshow(fff);title('解密图像');
%生成分析图
figure;subplot(2,1,1);imhist(fr);title('加密前R分量直方图');subplot(2,1,2);imhist(ffr);title('加密后R分量直方图');
figure;subplot(2,1,1);imhist(fg);title('加密前G分量直方图');subplot(2,1,2);imhist(ffg);title('加密后G分量直方图');
figure;subplot(2,1,1);imhist(fb);title('加密前B分量直方图');subplot(2,1,2);imhist(ffb);title('加密后B分量直方图');
1