前言:
前篇传送门 Arnold(猫脸)变换实现
继续开搞!!!
logistics映射
Logistic映射是研究动力系统、混沌、分形等复杂系统行为的一个经典模型。Logistic映射又叫Logistic迭代,是一个时间离散的动力系统。
其中μ∈[0,4] X∈[0,1]
当变化不同的参数μ的时候,该方程会展现出不同的动力学极限行为
稳定点(即最终x(t)始终为同一个数值)、周期(x(t)会在2个或者多个数值之间跳跃,以及混沌:x(t)的终态不会重复,而会等概率地取遍某区间)
这次要做的是混沌图像加密,所以我们需要使模型处于混沌状态即:
当μ∈[3.56994564,4]时,系统震荡周期如下
事实上,从μ>3.54以后,系统震荡的周期就变得越来越长,直到大概3.6的时候,周期长度趋向于无穷大,此时,系统开始了混沌状态。我们看到,随着系统的演化,x(t)的值会一直在0.3到0.9之间徘徊,没有固定的周期,而且行为很随机。
混沌加密
混沌加密的方法有很多,比如:
基于DCSK的混沌加密
基于Lorenz三维超混沌系统的图像加密
基于小波变换的混沌图像加密等等
logistics方程的混沌状态只是其中的一种实现方法
那么接下来开始上代码吧
代码实现步骤
1.创建html
上一篇做了个上传图片,好像没啥用,直接放一个图片多好~~
(这个决定让我踩了个坑~后面就看到了)
2.设置全局变量
这里μ和x自己设置就可以,也可以做个输入框输入
3.创建canvas并绘制图片
写好之后页面变成了这个样子,设置的图片已经被绘制到canvas上了
4.实现算法
在执行算法前先对初始值x迭代500次,达到充分混沌状态
创建一维混沌序列
执行这段代码后我们得到了一个长度为N的一维混沌序列,其实就是个元素在0-1之间随机的一维数组
下一步对一维混沌序列转换数据格式
matlab中成为归一化序列 uint8 格式,js 中没有这个函数自己实现一个就可以、
现在我们就得到了一个长度为N(N = width * width)的一维数组,下面将一维混沌序列转化成width*width的二维混沌序列
代码中的g_储存的就是二维混沌序列,接下来将图片的对应像素点的rgb和二维混沌序列中的uint8数据进行异或处理得到一个新的rgb并绘制重新绘制canvas
在获取所有像素点的时候出现了一个问题
1. 首先没有服务器环境(如:本地的 html网页,操作本地的图片),
就会报"Unable to get image data from canvas because the canvas has been tainted by cross-origin data"错误。
因为本地测试用的图片是文件夹内的,js跨域限制是不能获取非同一域名下的数据的,
而本地的位置是没有域名的,所以浏览器都认为你是跨域,导致报错。
2. 为了阻止欺骗,浏览器会追踪 image data。
当把一个和canvas的域不同的图片放到canvas上,这个canvas就成为 “tainted”(被污染的),浏览器就不让你操作该canvas 的任何像素。
是为了阻止多种类型的XSS/CSRF攻击(两种典型的跨站攻击)
所以给页面增加一个虚拟域名并指向到文件目录就可以了
比如这样
接下来用已经得到的二维混沌序列对图片的对应像素点进行加密
5.最终效果
结:
基于logistics映射的混沌图像加密就已经完成了;
因为异或的特性,所以对已经加密的图像用同样的二维混沌序列再次加密就得到了原图像;
所以在解密时用相同的初值x和参数μ得到的二维混沌序列就可以对加密图像进行解密了
参考:
https://blog.csdn.net/w5167839/article/details/45485645
http://wiki.swarma.net/index.php/Logistic%E6%98%A0%E5%B0%84
https://blog.csdn.net/hujingshuang/article/details/45717807
https://www.jiamisoft.com/blog/12591-logisticyingshejiamisuanfa.html
基于Logistic映射混沌加密算法的研究_韩凤英
基于Logistic映射混沌加密算法的设计与实现_邓绍江