算法基础
给定数 p p p和数 G G G,考虑同余式
p x ≡ 1 m o d G px\equiv 1\text{ }\bmod G px≡1 modG
当 gcd ( p , G ) ∣ 1 \left. \gcd \left( p,G \right) \right|1 gcd(p,G)∣1即 gcd ( p , G ) = 1 \gcd \left( p,G \right)=1 gcd(p,G)=1时同余式有解,记该解为
x ≡ q m o d G x\equiv q\text{ }\bmod G x≡q modG
∀ a ∈ Z \forall a\in \mathbb{Z} ∀a∈Z,记 p a m o d G = b pa\text{ }\bmod G=b pa modG=b,即有
p a ≡ b m o d G pa\equiv b\text{ }\bmod G pa≡b modG
则有
q b ≡ q ( p a ) = ( p q ) a ≡ a m o d G qb\equiv q\left( pa \right)=\left( pq \right)a\equiv a\text{ }\bmod G qb≡q(pa)=(pq)a≡a modG
模灰度级加密算法
给定一幅尺寸为 M × N M\times N M×N(单位:像素)的图像 I I I,确定其灰度级数 G G G(通常是 2 2 2的 n n n次幂,例如 2 2 2的 8 8 8次幂,即256)。
密钥: p ∈ Z p \in \mathbb{Z} p∈Z,满足 gcd ( p , G ) = 1 \gcd \left( p,G \right)=1 gcd(p,G)=1
解钥: q ∈ Z q \in \mathbb{Z} q∈Z,通过解 p q ≡ 1 m o d G pq\equiv 1\text{ }\bmod G pq≡1 modG求出。
加密过程
-
将明文 I I I加密为密文 I 1 { {I}_{1}} I1, I 1 { {I}_{1}} I1也是一个尺寸为 M × N M\times N M×N,灰度级为 G G G的图像,且每个像素处的灰度值 I 1 ( i , j ) { {I}_{1}}\left( i,j \right) I1(i,j)为
I 1 ( i , j ) = I ( i , j ) × p m o d G , i = 0 , 1 , ⋯ , M − 1 , j = 0 , 1 , ⋯ , N − 1 { {I}_{1}}\left( i,j \right)=I\left( i,j \right)\times p\text{ }\bmod G,\text{ }i=0,1,\cdots ,M-1,\text{ }j=0,1,\cdots ,N-1 I1(i,j)=I(i,j)×p modG, i=0,1,⋯,M−1, j=0,1,⋯,N−1 -
解密密文 I 1 { {I}_{1}} I1得到明文 I I I,每个像素处的灰度值 I ( i , j ) I\left( i,j \right) I(i,j)为
I ( i , j ) = I 1 ( i , j ) × q m o d G , i = 0 , 1 , ⋯ , M − 1 , j = 0 , 1 , ⋯ , N − 1 I\left( i,j \right)={ {I}_{1}}\left( i,j \right)\times q\text{ }\bmod G,\text{ }i=0,1,\cdots ,M-1,\text{ }j=0,1,\cdots ,N-1 I(i,j)=I1(i,j)×q modG, i=0,1,⋯,M−1, j=0,1,⋯,N−1
由上面的步骤可知,这是一种在图像空间域上的加密,是一种仅改变像素灰度值的加密,解密图像与原图没有差异。由于密钥和解钥一般不相等,因此也是一种公钥加密。
Matlab代码(以灰度级为 2 8 = 256 { {2}^{8}}=256 28=256的图像为例)
I = imread('待读入的图像路径+名称'); % 读入图像
G = 256; % 确定灰度级,默认图像是8位的,即灰度级是2^8=256
p = 5; % 确定密钥
% 检验密钥p与灰度级G的最大公因数是否为1
if gcd(p, G) ~= 1
error('密钥p与灰度级G的最大公因数不是1,不存在解钥');
end
% 展示原图像
figure, imshow(I);
% 将图像I进行加密得到密文I1, 并可视化
I1 = mod( double(I) * p, G );
figure, imshow( uint8(I1) );
% 利用简单的循环迭代找出解钥q
% 因为gcd(p, 256) = 1, 因此p一定是奇数。
% 又由于pq mod256 = 1, 因此q也一定是奇数。
q = 1;
while mod( p*q, G ) ~= 1
q = q + 2;
end
% 将密文I1解密得到I2, 并可视化
I2 = mod( I1 * q, G );
figure, imshow( uint8(I2) );
% 比较原图像I 与 解密得到的I2 是否一致(即该算法是否有损)
% 使用isequal(), 该函数返回真值当且仅当两个矩阵相同索引处的值均相等
if isequal( double(I), I2 )
disp('解密得到的图像与原图像一致');
else
disp('解密得到的图像与原图像不一致');
end