加密解密算法描述
设 NMA * 表示大小为 MxN 的图像,A(x,y)(x[0,M-1],y[0,N-1])表示图像 A 在点(x,
y)处的灰度值,A’(x,y)(x[0,M-1],y[0,N-1])表示为(x,y)经过加密后所对应的灰度值。
基于图像像素值替代的加密算法设计如下:
(l)给定两个 Logistic 系统的参数 1U 和 2U ,并给定两个系统初值 '
(2)取原始图像 A 的所有像素的值之和,该和对 256 取余运算,得到一个[0,255]范围的
10x 和 '
20x 。
整数,然后以该整数除以 256,得到的结果作为辅助密钥 k,k(O,l)。
(3)用辅助密钥 k 修改混沌系统初始值:
'
10x
= (
'
10x +k)/2, '
20x =(
'
20x +k)/2。以修正后的
10x 和 20x 。作为 logistic 混沌系统的初始值,由式(4.1)构造 2 个长度为 M*N 的实数混沌序
列。
(4)将由步骤(3)得到的 2 个实数混沌序列按式(4.7)进行转换,得到 2 个改进的混沌序
列:{y1(i)},{y2(i)},i=1,2,3,…,MxN。
(5)顺序取图像中的一点(设该点的序号为 n),若该点的序号属于奇数,则由实数混沌序
列的 y1(n) 构造加密密钥:
k(n)
=
mod(floor(
yl(n)
10*
256),15)
若该点的序号属于偶数,
则由实数混沌序列的 y2(n) 构造加密密钥:
k(n)
=
mod(floor(
y2(n)
10*
15),256)
。
(6)用原始图像 A 中的第 n 个像素点灰度值 A(x,y)与步骤(5)产生的 logistic 密钥值进行按
二进制位异或操作,得到加密后的像素值 A’(x,y)。
(7)重复(5)—(6)步,直到将将所有像素点加密完毕,即得到加密图像 A’。
解密过程是上述加密过程的逆过程,算法类似。
在 MATLAB 中进行加密解密的算法代码如下所示:
A=imread('rice.png');
imshow(A);
[M,N]=size(A);%原始图像 A 的尺寸一 MxN
u1=4;u2=4;x1(1)=0.2;x2(1)=0.7;
sumA=sum(sum(A));
k=mod(sumA,256)*1.0/255;
x1(1)=(x1(1)+k)/2;
x2(1)=(x2(1)+k)/2;
y1(1)=(1/3.1415926)*asin(sqrt(x1(1)));
y2(1)=(1/3.1415926)*asin(sqrt(x2(1)));
for i=1:1:M*N-1 %产生 2 个 Logistic 混沌序列
x1(i+1)=u1*x1(i)*(1-x1(i));
x2(i+1)=u2*x2(i)*(1-x2(i));
end
for i=1:1:M*N %改造 2 个 Logistic,得到两个 y 序列
y1(i)=(1/3.1415926)*asin(sqrt(x1(i)));
y2(i)=(1/3.1415926)*asin(sqrt(x2(i)));
end
n=1;
for i=1:1:M %由 yl 和 y2 序列对原图像进行值替代加密
for j=1:1:N
if mod(n,1)==0
k(n)=mod(floor(y1(n)*10^15),256);
else
k(n)=mod(floor(y2(n)*10^15),256);
end
A1(i,j)=bitxor(A(i,j),k(n)); %得到加密像素
n=n+1;
end
end
figure,imshow(A1); %输出得到的加密图像
n=1;
for i=1:1:M
for j=1:1:N
if mod(n,1)==0
k(n)=mod(floor(y1(n)*10^15),256);
else
k(n)=mod(floor(y2(n)*10^15),256);
end
A2(i,j)=bitxor(A1(i,j),k(n)); %得到加密像素
n=n+1;
end
end
figure,imshow(A2); %输出得到的解密图像