图像加密之灰度加密:基于 密钥 × 解钥 ≡ 1 mod 灰度级 的一轮加密算法原理和步骤

算法基础

  给定数 p p p和数 G G G,考虑同余式
p x ≡ 1     m o d   G px\equiv 1\text{ }\bmod G px1 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 xq modG
∀ a ∈ Z \forall a\in \mathbb{Z} aZ,记 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 pab 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 qbq(pa)=(pq)aa 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} pZ,满足 gcd ⁡ ( p , G ) = 1 \gcd \left( p,G \right)=1 gcd(p,G)=1

  解钥 q ∈ Z q \in \mathbb{Z} qZ,通过解 p q ≡ 1     m o d   G pq\equiv 1\text{ }\bmod G pq1 modG求出。

加密过程

  1. 将明文 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,,M1, j=0,1,,N1

  2. 解密密文 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,,M1, j=0,1,,N1

  由上面的步骤可知,这是一种在图像空间域上的加密,是一种仅改变像素灰度值的加密,解密图像与原图没有差异。由于密钥和解钥一般不相等,因此也是一种公钥加密

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

猜你喜欢

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