混沌Logistic加密

Logistic映射方程

方程形式如下:

Xn+1=μXn(1Xn)μ[0,4], Xn(0,1), n=0,1,,kX_{n+1}=\mu*X_n*(1-X_n)\\ \mu\in[0,4],\ X_n\in(0,1),\ n=0,1,\cdots,k

上式中,μ\mu 称为分支参数,该函数映射并不一定处于混沌状态,这与分支参数的取值有关,研究表明只有当 3.5699456<μ43.5699456<\mu\leq4 时,Logistic映射才具有混沌性质。

首先我们给定一个初值 X1X_1 ,并且 μ\mu 处在混沌范围中,当该函数迭代 n 次后,我们就能得到 X1,  X2,  ,  XnX_1,\;X_2,\;\cdots,\;X_n ,这是一个一维混沌序列,也就是我们想要得到的序列。

然后将该序列进行归一化,也就是序列要处于 (0, 255) 之间,最后再将其 reshape 成和待加密图像矩阵大小一样的二维矩阵,这就是我们用于加密的密钥、记作 imgN,密钥由初始值 X1μX_1、\mu 以及迭代次数 n 决定。

python代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 迭代n次,达到充分混沌状态
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  imgNmat\_encrypted = mat\ \oplus\ imgN

如果加密的图像是彩色图像,那么就要将三个通道分开加密最后再合并起来,得到一个加密的彩色图像。

解密则是利用同一个密钥 imgN,同样将加密矩阵与密钥进行异或,就能够得到解密后的图像:

mat_decrypted=mat_encrypted  imgNmat\_decrypted = mat\_encrypted\ \oplus\ 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]=[1baab+1][xnyn]  mod(N)\begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix}=\begin{bmatrix} 1 & b \\ a & ab+1 \end{bmatrix}\begin{bmatrix} x_{n} \\ y_{n} \end{bmatrix}\;mod(N)

a、b、N为正整数,a和b相当于密钥,N则是该方阵的长或宽,该置乱只讨论在图像长宽相等的前提下。

(xn,yn)(x_n,y_n)是原坐标,(xn+1,yn+1)(x_{n+1},y_{n+1})则是新坐标。

将矩阵展开后即可得到:

{xn+1=xn+byn      (mod  N)yn+1=axn+(ab+1)yn      (mod  N)\begin{cases}x_{n+1}=x_{n}+b*y_{n}\;\;\;(mod\;N) \\y_{n+1}=a*x_{n}+\left( ab+1\right)*y_n\;\;\;(mod\;N)\end{cases}

置乱的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

置乱可以进行多次,以达到更加混乱的状态,值得注意的是,该置乱变换是有周期性的,当置乱达到一定次数会变回原图像,因此置乱次数并不是越多次越好。

有了该加密变换后,还需要逆变换,也就是求矩阵[1baab+1]\begin{bmatrix} 1 & b \\ a & ab+1 \end{bmatrix}的逆,逆变换公式如下:

[xnyn]=[ab+1ba1][xn+1yn+1]  mod(N)\begin{bmatrix} x_{n} \\ y_{n} \end{bmatrix}=\begin{bmatrix} ab+1 & -b \\ -a & 1 \end{bmatrix}\begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix}\;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

结果示例: