索引
置乱加密:仅改变像素位置的加密。
算法思想与条件分析
给定一幅 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,⋯,N−1},赋予过程考虑采用矩阵乘法和取模运算的方式。
( 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均为整数。
理想的加密效果是:
- 密文图像 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)。
- 不发生信息覆盖和重叠,即明文图像 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. {
m≡ai+bj modNn≡ci+dj modN
整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N−1]×[0,N−1]上满射性质分析
效果1实质上等价于要求整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N−1]×[0,N−1]上的映射
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:0≤a,b≤N−1}(i,j)→→{
(a,b)∈Z2:0≤a,b≤N−1}(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,⋯,N−1},关于 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+bj≡m0 modNci+dj≡n0 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+bj≡m0 modNci+dj≡n0 modN ⇒ ⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧{
aci+bcj≡cm0 modNaci+adj≡an0 modN ⇒ (bc−ad)j≡cm0−an0 modN{
adi+bdj≡dm0 modNbci+bdj≡bn0 modN ⇒ (ad−bc)i≡dm0−bn0 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(bc−ad,N)∣(cm0−an0)gcd(ad−bc,N)∣(dm0−bn0), ∀m0,n0∈{
0,1,⋯,N−1}
当我们要求 gcd ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(ad−bc,N)=1时,上式也就自然成立了。
另一方面,我们也指出在 gcd ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(ad−bc,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} (ad−bc)i≡dm0−bn0 modN⇒a(ad−bc)i≡adm0−abn0 modN⇒a(ad−bc)i+bcm0−adm0≡bcm0−abn0 modN⇒a(ad−bc)i+(bc−ad)m0≡b(cm0−an0) modN⇒a(ad−bc)i+(bc−ad)m0≡b(bc−ad)j modN⇒a(bc−ad)i+b(bc−ad)j≡(bc−ad)m0 modN⇒ai+bj≡m0 modN (∵gcd(bc−ad,N)=1)
同理,由方程组②也能推出
c i + d j ≡ n 0 m o d N ci+dj\equiv {
{n}_{0}}\text{ }\bmod N ci+dj≡n0 modN
因此在满足 gcd ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(ad−bc,N)=1的前提下,方程组①必有解,其解可以通过解方程组②得出。此时效果1也满足了。
整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N−1]×[0,N−1]上单射性质分析
效果2实质上等价于要求整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N−1]×[0,N−1]上的映射
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:0≤a,b≤N−1}(i,j)→→{
(a,b)∈Z2:0≤a,b≤N−1}(m,n)
是单射。
实际上,基于前面满射条件的讨论,需要满足条件 gcd ( a d − b c , N ) = 1 \gcd \left( ad-bc,N \right)=1 gcd(ad−bc,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+bj1≡ai2+bj2≡m modNci1+dj1≡ci2+dj2≡n modN⇒{
a(i1−i2)≡b(j2−j1) modNc(i1−i2)≡d(j2−j1) modN⇒{
ac(i1−i2)=bc(j2−j1) modNac(i1−i2)=ad(j2−j1) modN⇒(ad−bc)(j2−j1)≡0 modN⇒j2−j1≡0 modN (∵gcd(ad−bc,N)=1)⇒j1=j2 (∵0≤j1,j2≤N−1)
同理也能推得 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,N−1]×[0,N−1]上的映射 T \mathcal{T} T既是单射又是满射时, T \mathcal{T} T就是一个双射,是一个可逆映射,因此存在一一对映的逆映射 T − 1 \mathcal{T}^{-1} T−1,代表着密文图像 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(ad−bc,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}} M−1,然后将密文图像 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)=M−1(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,N−1]×[0,N−1]上的双射 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:0≤a,b≤N−1}(i,j)→→{
(a,b)∈Z2:0≤a,b≤N−1}(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(akdk−bkck,N)=1, k = 1 , 2 , ⋯ , i t e r k=1,2,\cdots ,iter k=1,2,⋯,iter。
然后每一轮的加密操作按照上述一轮加密算法执行即可。
- 对于第1轮加密,输入是原始明文图像 I I I,输出是第1次加密结果 C 1 { {C}_{1}} C1;
- 对于第 k = 2 , 3 , ⋯ , i t e r − 1 k=2,3,\cdots ,iter-1 k=2,3,⋯,iter−1轮加密,输入是上一轮第 k − 1 k-1 k−1轮的加密结果 C k − 1 { {C}_{k-1}} Ck−1,输出是第 k k k轮的加密结果 C k { {C}_{k}} Ck;
- 对于第 i t e r iter iter轮加密,输入是第 i t e r − 1 iter-1 iter−1轮加密结果 C i t e r − 1 {
{C}_{iter-1}} Citer−1,输出是最终的密文图像 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=TiterTiter−1⋯T2T1作用下的结果。由于每一轮的映射 T k \mathcal{T}_k Tk是整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N−1]×[0,N−1]上的双射,因此 T \mathcal{T} T也是整 [ 0 , N − 1 ] × [ 0 , N − 1 ] \left[ 0,N-1 \right]\times \left[ 0,N-1 \right] [0,N−1]×[0,N−1]上的双射,因此多轮加密变换也是可逆的,即存在解密算法,且解密轮数也是 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