总有人间一两风,填我十万八千梦

MATLAB,简单的Logistic混沌加密算法原理

杂谈 Zero、J 5993℃ 0评论

上课要学习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混沌加密算法原理

喜欢 (11)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址