混沌Logistic加密
Logistic映射方程
方程形式如下:
Xn+1=μ∗Xn∗(1−Xn)μ∈[0,4], Xn∈(0,1), n=0,1,⋯,k
上式中,μ 称为分支参数,该函数映射并不一定处于混沌状态,这与分支参数的取值有关,研究表明只有当 3.5699456<μ≤4 时,Logistic映射才具有混沌性质。
首先我们给定一个初值 X1 ,并且 μ 处在混沌范围中,当该函数迭代 n 次后,我们就能得到 X1,X2,⋯,Xn ,这是一个一维混沌序列,也就是我们想要得到的序列。
然后将该序列进行归一化,也就是序列要处于 (0, 255) 之间,最后再将其 reshape 成和待加密图像矩阵大小一样的二维矩阵,这就是我们用于加密的密钥、记作 imgN,密钥由初始值 X1、μ 以及迭代次数 n 决定。
python代码示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| for i in range(n): x = u * x * (1 - x)
A = np.zeros(h * w, float) A[0] = x for i in range(h * w - 1): A[i+1] = u * A[i] * (1 - A[i])
B = np.array(A * 255, dtype="uint8")
imgN = B.reshape(h, w)
|
加解密
有了密钥 imgN,以及待加密图像矩阵 mat,这两个矩阵的大小是一样的,因此将它们直接进行异或就能够得到加密后的矩阵:
mat_encrypted=mat ⊕ imgN
如果加密的图像是彩色图像,那么就要将三个通道分开加密最后再合并起来,得到一个加密的彩色图像。
解密则是利用同一个密钥 imgN,同样将加密矩阵与密钥进行异或,就能够得到解密后的图像:
mat_decrypted=mat_encrypted ⊕ imgN
加密过程python代码示例如下:
1 2 3 4 5 6 7 8
| img = cv2.imread(image_path) x = 0.1417265 u = 4 b, g, r = cv2.split(img) B = imgN ^ b G = imgN ^ g R = imgN ^ r merged = cv2.merge([B, G, R])
|
结果示例
运行程序后得到的结果如下:
Arnold变换置乱
该变换也称为 cat映射,公式表达式如下:
[xn+1yn+1]=[1abab+1][xnyn]mod(N)
a、b、N为正整数,a和b相当于密钥,N则是该方阵的长或宽,该置乱只讨论在图像长宽相等的前提下。
(xn,yn)是原坐标,(xn+1,yn+1)则是新坐标。
将矩阵展开后即可得到:
{xn+1=xn+b∗yn(modN)yn+1=a∗xn+(ab+1)∗yn(modN)
置乱的python代码示例:
1 2 3 4 5
| for j in range(N): for i in range(N): xx = (i + b * j) % N yy = (a * i + j * (a * b + 1)) % N
|
置乱可以进行多次,以达到更加混乱的状态,值得注意的是,该置乱变换是有周期性的,当置乱达到一定次数会变回原图像,因此置乱次数并不是越多次越好。
有了该加密变换后,还需要逆变换,也就是求矩阵[1abab+1]的逆,逆变换公式如下:
[xnyn]=[ab+1−a−b1][xn+1yn+1]mod(N)
通过该逆变换后即可得到原图像。
逆变换的python代码示例:
1 2 3 4 5
| for j in range(N): for i in range(N): xx = ((a * b + 1) * i - b * j) % N yy = (-a * i + j) % N
|
结果示例: