方形图像加密之置乱加密:基于矩阵乘法和取模运算的多轮加密算法

置乱加密:仅改变像素位置的加密。

算法思想与条件分析

  给定一幅 N × N N\times N N×N的明文图像 I I I,对其进行置乱加密。考虑将明文图像 I I I ( i , j ) \left( i,j \right) (i,j)像素处的信息赋予到密文图像 C C C ( m , n ) \left( m,n \right) (m,n)像素, i , j , m , n ∈ { 0 , 1 , ⋯   , N − 1 } i,j,m,n\in \left\{ 0,1,\cdots ,N-1 \right\} i,j,m,n{ 0,1,,N1},赋予过程考虑采用矩阵乘法和取模运算的方式。
( m n ) = ( a b c d ) ( i j )     m o d   N \left( \begin{matrix} m \\ n \\ \end{matrix} \right)=\left( \begin{matrix} a & b \\ c & d \\ \end{matrix} \right)\left( \begin{matrix} i \\ j \\ \end{matrix} \right)\text{ }\bmod N (mn)=(acbd)(ij) modN
其中 a , b , c , d a,b,c,d a,b,c,d均为整数。
理想的加密效果是:

  1. 密文图像 C C C是一幅“完整的”图像,即 C C C的规格也是 N × N N\times N N×N,并且每个像素处的信息 C ( m , n ) C\left( m,n \right) C(m,n)非空,来自于明文图像 I I I中的某个像素处的信息 I ( i , j ) I\left( i,j \right) I(i,j)
  2. 不发生信息覆盖和重叠,即明文图像 I I I中两个不同像素处的信息 I ( i 1 , j 1 ) , I ( i 2 , j 2 ) I\left( { {i}_{1}},{ {j}_{1}} \right),I\left( { {i}_{2}},{ {j}_{2}} \right) I(i1,j1),I(i2,j2) ( i 1 , j 1 ) ≠ ( i 2 , j 2 ) \left( { {i}_{1}},{ {j}_{1}} \right)\ne \left( { {i}_{2}},{ {j}_{2}} \right) (i1,j1)=(i2,j2),不能赋向密文图像 C C C中同一个像素 ( m , n ) \left( m,n \right) (m,n)

  由赋予过程的表达式我们得到了等价的同余式组
{ m ≡ a i + b j     m o d   N n ≡ c i + d j     m o d   N \left\{ \begin{aligned} & m\equiv ai+bj\text{ }\bmod N \\ & n\equiv ci+dj\text{ }\bmod N \\ \end{aligned} \right. { mai+bj modNnci+dj modN

[ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上满射性质分析

  效果1实质上等价于要求整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上的映射
T : { ( a , b ) ∈ Z 2 : 0 ≤ a , b ≤ N − 1 } → { ( a , b ) ∈ Z 2 : 0 ≤ a , b ≤ N − 1 } ( i , j ) → ( m , n ) \mathcal{T}:\begin{matrix} \left\{ \left( a,b \right)\in { {\mathbb{Z}}^{2}}:0\le a,b\le N-1 \right\} & \to & \left\{ \left( a,b \right)\in { {\mathbb{Z}}^{2}}:0\le a,b\le N-1 \right\} \\ \left( i,j \right) & \to & \left( m,n \right) \\ \end{matrix} T:{ (a,b)Z2:0a,bN1}(i,j){ (a,b)Z2:0a,bN1}(m,n)
满射。因此要求 ∀ m 0 , n 0 ∈ { 0 , 1 , ⋯   , N − 1 } \forall { {m}_{0}},{ {n}_{0}}\in \left\{ 0,1,\cdots ,N-1 \right\} m0,n0{ 0,1,,N1},关于 i , j i,j i,j的同余式组
{ a i + b j ≡ m 0     m o d   N c i + d j ≡ n 0     m o d   N \left\{ \begin{aligned} & ai+bj\equiv { {m}_{0}}\text{ }\bmod N \\ & ci+dj\equiv { {n}_{0}}\text{ }\bmod N \\ \end{aligned} \right. { ai+bjm0 modNci+djn0 modN
有解。

  将同余式组作以下推理
① { a i + b j ≡ m 0     m o d   N c i + d j ≡ n 0     m o d   N   ⇒   { { a c i + b c j ≡ c m 0     m o d   N a c i + a d j ≡ a n 0     m o d   N   ⇒   ( b c − a d ) j ≡ c m 0 − a n 0     m o d   N { a d i + b d j ≡ d m 0     m o d   N b c i + b d j ≡ b n 0     m o d   N   ⇒   ( a d − b c ) i ≡ d m 0 − b n 0     m o d   N } ② ①\left\{ \begin{aligned} & ai+bj\equiv { {m}_{0}}\text{ }\bmod N \\ & ci+dj\equiv { {n}_{0}}\text{ }\bmod N \\ \end{aligned} \right.\text{ }\Rightarrow \text{ }\left\{ \left. \begin{aligned} & \left\{ \begin{aligned} & aci+bcj\equiv c{ {m}_{0}}\text{ }\bmod N \\ & aci+adj\equiv a{ {n}_{0}}\text{ }\bmod N \\ \end{aligned} \right.\text{ }\Rightarrow \text{ }\left( bc-ad \right)j\equiv c{ {m}_{0}}-a{ {n}_{0}}\text{ }\bmod N \\ & \left\{ \begin{aligned} & adi+bdj\equiv d{ {m}_{0}}\text{ }\bmod N \\ & bci+bdj\equiv b{ {n}_{0}}\text{ }\bmod N \\ \end{aligned} \right.\text{ }\Rightarrow \text{ }\left( ad-bc \right)i\equiv d{ {m}_{0}}-b{ {n}_{0}}\text{ }\bmod N \\ \end{aligned} \right\} ②\right. { ai+bjm0 modNci+djn0 modN  { aci+bcjcm0 modNaci+adjan0 modN  (bcad)jcm0an0 modN{ adi+bdjdm0 modNbci+bdjbn0 modN  (adbc)idm0bn0 modN
因此方程组①有解 ( i , j ) \left( i,j \right) (i,j),那么解 ( i , j ) \left( i,j \right) (i,j)也满足方程组②,即方程组②也有解。而方程组②有解等价于
{ gcd ⁡ ( b c − a d , N ) ∣ ( c m 0 − a n 0 ) gcd ⁡ ( a d − b c , N ) ∣ ( d m 0 − b n 0 ) ,   ∀ m 0 , n 0 ∈ { 0 , 1 , ⋯   , N − 1 } \left\{ \begin{aligned} & \left. \gcd \left( bc-ad,N \right) \right|\left( c{ {m}_{0}}-a{ {n}_{0}} \right) \\ & \left. \gcd \left( ad-bc,N \right) \right|\left( d{ {m}_{0}}-b{ {n}_{0}} \right) \\ \end{aligned} \right.,\text{ }\forall { {m}_{0}},{ {n}_{0}}\in \left\{ 0,1,\cdots ,N-1 \right\} { gcd(bcad,N)(cm0an0)gcd(adbc,N)(dm0bn0), m0,n0{ 0,1,,N1}
当我们要求 gcd ⁡ ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(adbc,N)=1,上式也就自然成立了。

  另一方面,我们也指出在 gcd ⁡ ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(adbc,N)=1的条件下,方程组②的解也是方程组①的解。
事实上,对方程组②进行以下推理
( a d − b c ) i ≡ d m 0 − b n 0     m o d   N ⇒ a ( a d − b c ) i ≡ a d m 0 − a b n 0     m o d   N ⇒ a ( a d − b c ) i + b c m 0 − a d m 0 ≡ b c m 0 − a b n 0     m o d   N ⇒ a ( a d − b c ) i + ( b c − a d ) m 0 ≡ b ( c m 0 − a n 0 )     m o d   N ⇒ a ( a d − b c ) i + ( b c − a d ) m 0 ≡ b ( b c − a d ) j     m o d   N ⇒ a ( b c − a d ) i + b ( b c − a d ) j ≡ ( b c − a d ) m 0     m o d   N ⇒ a i + b j ≡ m 0     m o d   N   ( ∵ gcd ⁡ ( b c − a d , N ) = 1 ) \begin{aligned} & \left( ad-bc \right)i\equiv d{ {m}_{0}}-b{ {n}_{0}}\text{ }\bmod N \\ & \Rightarrow a\left( ad-bc \right)i\equiv ad{ {m}_{0}}-ab{ {n}_{0}}\text{ }\bmod N \\ & \Rightarrow a\left( ad-bc \right)i+bc{ {m}_{0}}-ad{ {m}_{0}}\equiv bc{ {m}_{0}}-ab{ {n}_{0}}\text{ }\bmod N \\ & \Rightarrow a\left( ad-bc \right)i+\left( bc-ad \right){ {m}_{0}}\equiv b\left( c{ {m}_{0}}-a{ {n}_{0}} \right)\text{ }\bmod N \\ & \Rightarrow a\left( ad-bc \right)i+\left( bc-ad \right){ {m}_{0}}\equiv b\left( bc-ad \right)j\text{ }\bmod N \\ & \Rightarrow a\left( bc-ad \right)i+b\left( bc-ad \right)j\equiv \left( bc-ad \right){ {m}_{0}}\text{ }\bmod N \\ & \Rightarrow ai+bj\equiv { {m}_{0}}\text{ }\bmod N\text{ }\left( \because \gcd \left( bc-ad,N \right)=1 \right) \\ \end{aligned} (adbc)idm0bn0 modNa(adbc)iadm0abn0 modNa(adbc)i+bcm0adm0bcm0abn0 modNa(adbc)i+(bcad)m0b(cm0an0) modNa(adbc)i+(bcad)m0b(bcad)j modNa(bcad)i+b(bcad)j(bcad)m0 modNai+bjm0 modN (gcd(bcad,N)=1)
同理,由方程组②也能推出
c i + d j ≡ n 0     m o d   N ci+dj\equiv { {n}_{0}}\text{ }\bmod N ci+djn0 modN

  因此在满足 gcd ⁡ ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(adbc,N)=1的前提下,方程组①必有解,其解可以通过解方程组②得出。此时效果1也满足了。

[ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上单射性质分析

  效果2实质上等价于要求整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上的映射
T : { ( a , b ) ∈ Z 2 : 0 ≤ a , b ≤ N − 1 } → { ( a , b ) ∈ Z 2 : 0 ≤ a , b ≤ N − 1 } ( i , j ) → ( m , n ) \mathcal{T}:\begin{matrix} \left\{ \left( a,b \right)\in { {\mathbb{Z}}^{2}}:0\le a,b\le N-1 \right\} & \to & \left\{ \left( a,b \right)\in { {\mathbb{Z}}^{2}}:0\le a,b\le N-1 \right\} \\ \left( i,j \right) & \to & \left( m,n \right) \\ \end{matrix} T:{ (a,b)Z2:0a,bN1}(i,j){ (a,b)Z2:0a,bN1}(m,n)
单射

  实际上,基于前面满射条件的讨论,需要满足条件 gcd ⁡ ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(adbc,N)=1。我们指出在这个条件下 T \mathcal{T} T自然是一个单射。实际上有以下推理
{ a i 1 + b j 1 ≡ a i 2 + b j 2 ≡ m     m o d   N c i 1 + d j 1 ≡ c i 2 + d j 2 ≡ n     m o d   N ⇒ { a ( i 1 − i 2 ) ≡ b ( j 2 − j 1 )     m o d   N c ( i 1 − i 2 ) ≡ d ( j 2 − j 1 )     m o d   N ⇒ { a c ( i 1 − i 2 ) = b c ( j 2 − j 1 )     m o d   N a c ( i 1 − i 2 ) = a d ( j 2 − j 1 )     m o d   N ⇒ ( a d − b c ) ( j 2 − j 1 ) ≡ 0     m o d   N ⇒ j 2 − j 1 ≡ 0     m o d   N   ( ∵ gcd ⁡ ( a d − b c , N ) = 1 ) ⇒ j 1 = j 2   ( ∵ 0 ≤ j 1 , j 2 ≤ N − 1 ) \begin{aligned} & \left\{ \begin{aligned} & a{ {i}_{1}}+b{ {j}_{1}}\equiv a{ {i}_{2}}+b{ {j}_{2}}\equiv m\text{ }\bmod N \\ & c{ {i}_{1}}+d{ {j}_{1}}\equiv c{ {i}_{2}}+d{ {j}_{2}}\equiv n\text{ }\bmod N \\ \end{aligned} \right. \\ & \Rightarrow \left\{ \begin{aligned} & a\left( { {i}_{1}}-{ {i}_{2}} \right)\equiv b\left( { {j}_{2}}-{ {j}_{1}} \right)\text{ }\bmod N \\ & c\left( { {i}_{1}}-{ {i}_{2}} \right)\equiv d\left( { {j}_{2}}-{ {j}_{1}} \right)\text{ }\bmod N \\ \end{aligned} \right. \\ & \Rightarrow \left\{ \begin{aligned} & ac\left( { {i}_{1}}-{ {i}_{2}} \right)=bc\left( { {j}_{2}}-{ {j}_{1}} \right)\text{ }\bmod N \\ & ac\left( { {i}_{1}}-{ {i}_{2}} \right)=ad\left( { {j}_{2}}-{ {j}_{1}} \right)\text{ }\bmod N \\ \end{aligned} \right. \\ & \Rightarrow \left( ad-bc \right)\left( { {j}_{2}}-{ {j}_{1}} \right)\equiv 0\text{ }\bmod N \\ & \Rightarrow { {j}_{2}}-{ {j}_{1}}\equiv 0\text{ }\bmod N\text{ }\left( \because \gcd \left( ad-bc,N \right)=1 \right) \\ & \Rightarrow { {j}_{1}}={ {j}_{2}}\text{ }\left( \because 0\le { {j}_{1}},{ {j}_{2}}\le N-1 \right) \\ \end{aligned} { ai1+bj1ai2+bj2m modNci1+dj1ci2+dj2n modN{ a(i1i2)b(j2j1) modNc(i1i2)d(j2j1) modN{ ac(i1i2)=bc(j2j1) modNac(i1i2)=ad(j2j1) modN(adbc)(j2j1)0 modNj2j10 modN (gcd(adbc,N)=1)j1=j2 (0j1,j2N1)
同理也能推得 i 1 = i 2 { {i}_{1}}={ {i}_{2}} i1=i2。因此 ∀ ( i 1 , j 1 ) ≠ ( i 2 , j 2 ) \forall \left( { {i}_{1}},{ {j}_{1}} \right)\ne \left( { {i}_{2}},{ {j}_{2}} \right) (i1,j1)=(i2,j2),有 ( m 1 , n 1 ) = T ( i 1 , j 1 ) ≠ T ( i 2 , j 2 ) = ( m 2 , n 2 ) \left( { {m}_{1}},{ {n}_{1}} \right)=\mathcal{T}\left( { {i}_{1}},{ {j}_{1}} \right)\ne \mathcal{T}\left( { {i}_{2}},{ {j}_{2}} \right)=\left( { {m}_{2}},{ {n}_{2}} \right) (m1,n1)=T(i1,j1)=T(i2,j2)=(m2,n2)。单射性证毕。

解密可行性

  当加密过程中整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上的映射 T \mathcal{T} T既是单射又是满射时, T \mathcal{T} T就是一个双射,是一个可逆映射,因此存在一一对映的逆映射 T − 1 \mathcal{T}^{-1} T1,代表着密文图像 C C C可被解密为原明文图像 I I I

一轮加解密算法步骤

一轮加密算法
  给定一幅 N × N N \times N N×N的明文图像 I I I,基于此设计一个 2 × 2 2 \times 2 2×2的变换矩阵 M = ( a b c d ) M=\left( \begin{matrix} a & b \\ c & d \\ \end{matrix} \right) M=(acbd)
满足 gcd ⁡ ( det ⁡ ( M ) , N ) = gcd ⁡ ( a d − b c , N ) = 1 \gcd \left( \det \left( M \right),N \right)=\gcd \left( ad-bc,N \right)=1 gcd(det(M),N)=gcd(adbc,N)=1
然后将明文图像 I I I中每个像素 ( i , j ) \left( i,j \right) (i,j)处的灰度值赋向密文图像 C C C中的 ( m , n ) \left( m,n \right) (m,n)像素,其中 ( m , n ) \left( m,n \right) (m,n) ( i , j ) \left( i,j \right) (i,j)的关系由下式给出
( m n ) = ( a b c d ) ( i j )     m o d   N \left( \begin{matrix} m \\ n \\ \end{matrix} \right)=\left( \begin{matrix} a & b \\ c & d \\ \end{matrix} \right)\left( \begin{matrix} i \\ j \\ \end{matrix} \right)\text{ }\bmod N (mn)=(acbd)(ij) modN

一轮解密算法
法一
  由于 gcd ⁡ ( det ⁡ ( M ) , N ) = 1 \gcd \left( \det \left( M \right),N \right)=1 gcd(det(M),N)=1,而图像规格 N N N一般 ≫ 1 \gg 1 1,因此 det ⁡ ( M ) ≠ 0 \det \left( M \right)\ne 0 det(M)=0,即矩阵 M = ( a b c d ) M=\left( \begin{matrix} a & b \\ c & d \\ \end{matrix} \right) M=(acbd)可逆。求出其逆矩阵 M − 1 { {M}^{-1}} M1,然后将密文图像 C C C在每个像素 ( m , n ) \left( m,n \right) (m,n)处的灰度值 C ( m , n ) C\left( m,n \right) C(m,n)赋给解密结果图 I I I中的像素 ( i , j ) \left( i,j \right) (i,j),其中 ( i , j ) \left( i,j \right) (i,j) ( m , n ) \left( m,n \right) (m,n)的关系由下式给出
( i j ) = M − 1 ( m n ) \left( \begin{matrix} i \\ j \\ \end{matrix} \right)={ {M}^{-1}}\left( \begin{matrix} m \\ n \\ \end{matrix} \right) (ij)=M1(mn)

法二(下面提供的解密算法Matlab程序采用的思路)
  不去算 M M M的逆矩阵,而是根据原来 M M M的信息找出 I I I ( i , j ) \left( i,j \right) (i,j) C C C ( m , n ) \left( m,n \right) (m,n)的一一对应关系,然后进行回溯,将密文图像 C C C ( m , n ) \left( m,n \right) (m,n)像素的灰度值 C ( m , n ) C\left( m,n \right) C(m,n)赋回到明文图像 I I I中对应的 ( i , j ) \left( i,j \right) (i,j)像素。

多轮加解密算法策略

多轮加密算法
  有时候为了提高图像加密的安全程度,会对一明文图像 I I I进行多轮加密。设加密轮数为 i t e r iter iter,每一轮的整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上的双射 T k \mathcal{T}_k Tk
T k : { ( a , b ) ∈ Z 2 : 0 ≤ a , b ≤ N − 1 } → { ( a , b ) ∈ Z 2 : 0 ≤ a , b ≤ N − 1 } ( i , j ) → ( m , n ) \mathcal{T}_k:\begin{matrix} \left\{ \left( a,b \right)\in { {\mathbb{Z}}^{2}}:0\le a,b\le N-1 \right\} & \to & \left\{ \left( a,b \right)\in { {\mathbb{Z}}^{2}}:0\le a,b\le N-1 \right\} \\ \left( i,j \right) & \to & \left( m,n \right) \\ \end{matrix} Tk:{ (a,b)Z2:0a,bN1}(i,j){ (a,b)Z2:0a,bN1}(m,n)
对应的变换矩阵为 M k = ( a k b k c k d k ) { {M}_{k}}=\left( \begin{matrix} { {a}_{k}} & { {b}_{k}} \\ { {c}_{k}} & { {d}_{k}} \\ \end{matrix} \right) Mk=(akckbkdk),满足 gcd ⁡ ( a k d k − b k c k , N ) = 1 \gcd \left( { {a}_{k}}{ {d}_{k}}-{ {b}_{k}}{ {c}_{k}},N \right)=1 gcd(akdkbkck,N)=1 k = 1 , 2 , ⋯   , i t e r k=1,2,\cdots ,iter k=1,2,,iter
然后每一轮的加密操作按照上述一轮加密算法执行即可。

  1. 对于第1轮加密,输入是原始明文图像 I I I,输出是第1次加密结果 C 1 { {C}_{1}} C1
  2. 对于第 k = 2 , 3 , ⋯   , i t e r − 1 k=2,3,\cdots ,iter-1 k=2,3,,iter1轮加密,输入是上一轮第 k − 1 k-1 k1轮的加密结果 C k − 1 { {C}_{k-1}} Ck1,输出是第 k k k轮的加密结果 C k { {C}_{k}} Ck
  3. 对于第 i t e r iter iter轮加密,输入是第 i t e r − 1 iter-1 iter1轮加密结果 C i t e r − 1 { {C}_{iter-1}} Citer1,输出是最终的密文图像 C i t e r { {C}_{iter}} Citer

多轮解密算法
  多轮加密算法得到的结果其实等价于明文图像 I I I在复合映射 T = T i t e r T i t e r − 1 ⋯ T 2 T 1 \mathcal{T}={ {\mathcal{T}}_{iter}}{ {\mathcal{T}}_{iter-1}}\cdots { {\mathcal{T}}_{2}}{ {\mathcal{T}}_{1}} T=TiterTiter1T2T1作用下的结果。由于每一轮的映射 T k \mathcal{T}_k Tk是整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上的双射,因此 T \mathcal{T} T也是整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N1]×[0,N1]上的双射,因此多轮加密变换也是可逆的,即存在解密算法,且解密轮数也是 i t e r iter iter轮。

  多轮解密算法需要从多轮加密算法最后一轮的结果出发,一轮一轮回溯进行解密。每一轮的操作同一轮解密算法中的思想。

Matlab代码

加密算法函数文件 (linear_mod_encryption.m)

function C = linear_mod_encryption( I, M, iter )
%% 说明
% 参数意义
% I : 输入的明文图像
% M : 输入的变换矩阵序列, M的形式有以下两种
%     一个矩阵, 此时每一轮置乱都使用该矩阵
%     一个 1*iter 的元胞数组, 每个元素是对应轮的变换矩阵  
% iter : 输入的置乱轮数
% C : 输出的密文图像
%
% 功能
% 对输入的明文图像I在相应变换矩阵的作用下加密iter轮得到密文图像C

%% 检验输入的参数

% 检验输入的明文图像是否是方阵
[row, column] = size(I);
if row ~= column
    error('输入的明文图像不是一个方阵');
end
N = row;

% 检验输入的置乱轮数iter是否为正整数
if floor(iter) ~= iter || iter < 1
    error('输入的置乱轮数iter不是一个正整数');
end

% 将输入的变换矩阵序列M统一规范化为cell类型
if ~iscell(M)
    M = {
    
    M};
end

% 检验变换矩阵序列M的长度是否等于iter, 每个矩阵是否是2*2的实整数矩阵
% 以及每个矩阵的行列式是否与图像规格N互素
[row, column] = size(M);
if row ~= 1 || ~(column == 1 || column == iter)
    error('输入的变换矩阵序列M应该是一个matrix或者是一个1*iter的cell');
end
for i = 1 : column
    [row1, column1] = size( M{
    
    i} );
    if row1 ~= 2 || column1 ~= 2
        error(['变换矩阵序列中的第', num2str(i), '个矩阵不是2*2矩阵']);
    end
    if ~isreal( M{
    
    i} ) || ismember(1, floor( M{
    
    i} ) ~= M{
    
    i})
        error(['变换矩阵序列中的第', num2str(i), '个矩阵存在非实整数元素']);
    end
    if gcd( det( M{
    
    i} ), N ) ~= 1
        error(['变换矩阵序列中的第', num2str(i), '个矩阵对应的置乱变换不可逆']);
    end
end

%% 函数主体
C = I;
for k = 1 : iter
    for i = 0 : N - 1
        for j = 0 : N - 1
            I_pos = [ i ; j ];
            C_pos = mod( M{
    
    min(end, iter)} * I_pos, N );
            % 使用M{
    
     min(end, iter) }是考虑到输入矩阵只有一个,而iter > 1的情况
            C( C_pos(1) + 1, C_pos(2) + 1 ) = ...
                I( I_pos(1) + 1, I_pos(2) + 1 );
        end
    end
    disp(['完成第', num2str(k), '轮加密']);
    I = C;
end
end

解密算法函数文件 (linear_mod_decryption.m)

function I = linear_mod_decryption( C, M, iter )
%% 说明
% 参数意义
% C : 输入的密文图像
% M : 输入的加密变换矩阵序列, M的形式有以下两种
%     1. 一个矩阵, 此时每一轮解密都使用该加密矩阵的信息
%     2. 一个 1*iter 的元胞数组, 每个元素是对应轮的加密变换矩阵
%       M{
    
    1}是加密过程中第一轮的加密矩阵
%       M{
    
    2}是加密过程中第二轮的加密矩阵,以此类推
% iter : 输入的解密轮数(=原加密轮数)
% I : 输出的明文图像
%
% 功能
% 对输入的密文图像C,根据相应变换矩阵的信息,解密iter轮得到明文图像I

%% 检验输入的参数

% 检验输入的密文图像是否是方阵
[row, column] = size(C);
if row ~= column
    error('输入的明文图像不是一个方阵');
end
N = row;

% 检验输入的解密轮数iter是否为正整数
if floor(iter) ~= iter || iter < 1
    error('输入的置乱轮数iter不是一个正整数');
end

% 将输入的加密变换矩阵序列M统一规范化为cell类型
if ~iscell(M)
    M = {
    
    M};
end

% 检验加密变换矩阵序列M的长度是否等于iter, 每个矩阵是否是2*2的实整数矩阵
% 以及每个矩阵的行列式是否与图像规格N互素
[row, column] = size(M);
if row ~= 1 || ~(column == 1 || column == iter)
    error('输入的加密变换矩阵序列M应该是一个matrix或者是一个1*iter的cell');
end
for i = 1 : column
    [row1, column1] = size( M{
    
    i} );
    if row1 ~= 2 || column1 ~= 2
        error(['变换矩阵序列中的第', num2str(i), '个矩阵不是2*2矩阵']);
    end
    if ~isreal( M{
    
    i} ) || ismember(1, floor( M{
    
    i} ) ~= M{
    
    i})
        error(['变换矩阵序列中的第', num2str(i), '个矩阵存在非实整数元素']);
    end
    if gcd( det( M{
    
    i} ), N ) ~= 1
        error(['变换矩阵序列中的第', num2str(i), '个矩阵对应的置乱变换不可逆']);
    end
end

%% 函数主体
I = C;
for k = iter : -1 : 1  % 注意解密是加密的回溯,从最后一个加密矩阵的结果开始回溯
    for i = 0 : N - 1
        for j = 0 : N - 1
            I_pos = [ i ; j ];
            C_pos = mod( M{
    
    min(end, iter)} * I_pos, N );
            % 使用M{
    
     min(end, iter) }是考虑到输入矩阵只有一个,而iter > 1的情况
            I( I_pos(1) + 1, I_pos(2) + 1 ) = ...
                C( C_pos(1) + 1, C_pos(2) + 1 );
        end
    end
    disp(['完成第', num2str(iter - k + 1), '轮解密']);
    C = I;
end
end

猜你喜欢

转载自blog.csdn.net/qq_44261017/article/details/109714351