www.pudn.com > hundun.rar > hundun.m


clear all,clc 
g=double(imresize(imread('lena.tif'),[128,128])); 
[m,n]=size(g); 
h=0.001;    %lorenz混沌序列初始化 
x=zeros(1,40001);x(1)=1; 
y=zeros(1,40001);y(1)=1; 
z=zeros(1,40001);z(1)=1; 
%for i=1:40000         %产生lorenz混沌序列初始化,欧拉法 
  % x(i+1)=x(i)+h*(10*(y(i)-x(i))); 
  % y(i+1)=y(i)+h*(28*x(i)-x(i)*z(i)-y(i)); 
  % z(i+1)=z(i)+h*(x(i)*y(i)-8/3*z(i)); 
  %end 
  t(1)=0;  
 for i=1:40000 
     t(k+1)=t(k)+h;  
     if t(k)  
         k1=-0.1*x(k); 
         k2=-0.1*(x(k)+h*k1/3);  
k3=-0.1*(x(k)+(-k1+3*k2)*h/3);  
k4=-0.1*(x(k)+(k1-k2+k3)*h);  
k5=-0.1*(x(k)+(k1+3*k2+3*k3+k4)*h/8);  
x(k+1)=x(k)+(k1+3*k2+3*k3+k4)*h/8;  
 
      
x(i+1)=x(i)+h*( 
for i=1:40000  %对3个序列进行改进 
    x(i)=x(i)*1000000-round(x(i)*1000000); 
    y(i)=y(i)*1000000-round(y(i)*1000000); 
    z(i)=z(i)*1000000-round(z(i)*1000000); 
end 
for j=1:n  %用位异或法对像素进行置乱 
 h=double(uint8((m*n*(x(n+j)+0.5))*ones(m,1))); 
 g1(:,j)=bitxor(g(:,j),h); 
 k1(:,j)=bitxor(g1(:,j),h); %对像素置乱进行解密 
end 
for i=1:m  %对行进行置乱 
 t(1:n)=y(1:n); 
 [t1,p] =sort(t(1:n));%按由小到大的顺序生成新序列t1,位置为p(排序后的项在原来序列中的位置索引) 
 t1=flipud(t1);%按由大到小的顺序生成新序列t1 
 g2(i,:)=g1(i,p);%按指定的新位置IX重新赋给 
 k2(i,p)=g2(i,:); 
end 
for j=1:n    %列置乱 
   t(1:m)=z(1:m); 
   [t1,p] =sort(t(1:m));%按由小到大的顺序生成新序列t1,位置为p 
   p=flipud(p); 
   g3(:,j)=g2(p,j);%用该列的第pi行替换该列的第i行 
   k3(p,j)=g3(:,j);%用该列的第pi行重新替换该列的第i行,解密 
end 
for i=1:m  %对行进行解密 
 t(1:n)=y(1:n); 
 [t1,p] =sort(t(1:n));%按由小到大的顺序生成新序列t1,位置为p(排序后的项在原来序列中的位置索引) 
 t1=flipud(t1);%按由大到小的顺序生成新序列t1 
  k2(i,p)=k3(i,:); 
end 
for j=1:n  %用位异或法对像素进行解密 
 h=double(uint8((m*n*(x(n+j)+0.5))*ones(m,1))); 
 k1(:,j)=bitxor(k2(:,j),h); %对像素置乱进行解密 
end 
 
h=0.001 
x=zeros(1,40001);x(1)=1.01;%密钥错误时进行解密 
y=zeros(1,40001);y(1)=1; 
z=zeros(1,40001);z(1)=1; 
for i=1:40000         %产生lorenz混沌序列初始化,欧拉法 
   x(i+1)=x(i)+h*(10*(y(i)-x(i))); 
   y(i+1)=y(i)+h*(28*x(i)-x(i)*z(i)-y(i)); 
   z(i+1)=z(i)+h*(x(i)*y(i)-8/3*z(i)); 
end 
for i=1:40000  %对3个序列进行改进 
    x(i)=x(i)*1000000-round(x(i)*1000000); 
    y(i)=y(i)*1000000-round(y(i)*1000000); 
    z(i)=z(i)*1000000-round(z(i)*1000000); 
end 
for j=1:n    %列置乱 
   t(1:m)=z(1:m); 
   [t1,p] =sort(t(1:m));%按由小到大的顺序生成新序列t1,位置为p 
   p=flipud(p); 
  %g3(:,j)=g2(p,j);%用该列的第pi行替换该列的第i行 
   w3(p,j)=g3(:,j);%用该列的第pi行重新替换该列的第i行,解密 
end 
for i=1:m  %对行进行解密 
 t(1:n)=y(1:n); 
 [t1,p] =sort(t(1:n));%按由小到大的顺序生成新序列t1,位置为p(排序后的项在原来序列中的位置索引) 
 t1=flipud(t1);%按由大到小的顺序生成新序列t1 
  w2(i,p)=w3(i,:); 
end 
for j=1:n  %用位异或法对像素进行解密 
 h=double(uint8((m*n*(x(n+j)+0.5))*ones(m,1))); 
 w1(:,j)=bitxor(w2(:,j),h); %对像素置乱进行解密 
end 
 
 
subplot(221),imshow(g,[]),xlabel('原图像'); 
subplot(222),imshow(g3,[]),xlabel('加密图像') 
subplot(223),imshow(k1,[]),xlabel('正确密钥的解密图像') 
subplot(224),imshow(w1,[]),xlabel('错误密钥的解密图像')