上课要学习MATLAB,然后搞各种图像问题,头都大了,这里分享一个简单的Logistic混沌加密算法,其实这个算法的核心是很简单的,只是几个逻辑操作就完成了。
先说一下原理吧
这里先不谈这个算法问题,先来看一个简单的问题,“现有a,b两个变量,不借助第三个变量c,如何完成交换?”,你没有看错,交换两个数值只需要2个变量,计算方法如下:
int a=100,b=10; a=a^b; b=a^b; a=a^b;
看明白了吧,只是通过异或操作就可以了,原理也就是a^b^b的结果是a。换而言之,如果一个像素点是a,通过一个加密的因子b计算得到心的像素点 a^b,在解密的时候只需要将加密后的像素点 a^b与加密因子b再来一次^异或操作即可还原。
附上相关的MATLAB代码实现:
%读取一个jpg图像文件,数据存放到x变量中 x=imread('lenan.jpg');%随便搞张图,这张图就是用来测试加解密的图片 %读取信息存放到m,n,s [m,n,s]=size(x); %保存原始图片的数据 y=x; %密钥 x0=0.2915826302; %u∈[3.599456……,4 ],越靠近4,混沌效果越好 u=4.0; for i=1:s for j=1:n for k=1:m %计算x0 x0=u*x0*(1-x0); key=mod(x0*1000,256); %异或操作,结果放到y中 y(k,j,i)=bitxor(x(k,j,i),uint8(key)); end end end %1行3列,第一个位置显示原始图片 figure,subplot(1,3,1),imshow(x),title('a'); %1行3列,第二个位置显示加密图片 subplot(1,3,2),imshow(y),title('b'); %加密结果写入 文件 imwrite(y,'b.bmp'); %读取加密的文件 x=imread('b.bmp'); %获取到size信息 [m,n,s]=size(x); %密钥,要和加密的密钥一致 x0=0.2915826302; u=4.0; for i=1:s for j=1:n for k=1:m %计算x0 x0=u*x0*(1-x0); key=mod(x0*1000,256); %再次异或操作执行解密 y(k,j,i)=bitxor(x(k,j,i),uint8(key)); end end end %显示图片 subplot(1,3,3),imshow(y),title('c'); imwrite(y,'c.bmp');
从上面的代码种可以看到,在加密和解密的for循环中,每个像素对应的x0都是一样的,也就是说对于同一个像素位置,其所使用的加密因子是相同的,只是为了产生混沌效果,对于每一个像素所使用的加密因子都是通过一个计算获得的。
转载请注明:悠然品鉴 » MATLAB,简单的Logistic混沌加密算法原理