Java代码使用复合混沌体系实现图片的加解密操作。
代码下载链接【复制可使用】:RuoYi - 403
记得在使用的时候修改一下文件输入输出路径。
【实验目的】
- 熟悉混沌的定义。
- 掌握复合混沌映射的特性。
- 掌握复合混沌映射的加、解密原理。
- 编程实现复合混沌映射的加、解密过程。
【实验原理】
单一的混沌迭代系统,其动力学行为容易破译,而复合混沌迭代系统的动力学行为则与复合序列R和各个混沌迭代子系统的动力学行为有关。一般而言,复合迭代系统保持了所有迭代子系统的混沌特性,比单个子系统的动力学行为还要复杂得多。由于采用了满足特定要求的复合序列和转换算子,使得加密位具有均匀的、独立同分布的特性,其抗统计性能良好。从其在数字图像加密中的运用来看,无论其视觉效果还是性能指数均优于一些常见的数字图像加密技术。
在(0,1)上构造两个特殊的函数,并对其性质进行分析。在(0,1)定义函数
(1)
(2)
由此可以得到两个迭代函数
。其性质请参考平台给出的文档。
由此,我们可以得到如图1所示的复合混沌加密模型。
图1 复合混沌序列数字图像的加密
其中,0、1均匀的比特流ri由线性反馈移位寄存器给出,图2给出了使用本原多项式的线性反馈移位寄存器的工作原理模型。
根据平台文档给出的定理2,复合混沌的解密可以使用
或者
来解密,图3给出了使用
解密的模型。
图2线性反馈移位寄存器
图3 复合混沌序列数字图像的解密(使用
解密)
常见的本原多项式如图4所示。使用本原多项式对应位置的比特作为抽头值,可以使得其连续输出的2n+1-2个值在[1,2n+1-1]之间随机且唯一地出现一次,这样,就能确保这连续输出的2n+1-2个值中,0和1出现的概率相等。只要待加密对象的字节长度远远大于2n+1-2,就可以忽略比特流ri中0、1的不均匀性。
例如:一副1024×768×3(共2359296字节)字节的彩色图像,在使用n为7的本原多项式时,2n+1-2的值仅仅为254,显然,254是远远小于2359296的。
图4 常见的本原多项式
这里去掉的2个值是全0和全1的两个值,它们的出现会是线性反馈移位寄存器失去作用。
表1给出的数据表明,复合混沌加、解密系统产生的密文c输出具有独立同分布与均匀性,图5的加密效果给出了很好的说明。
表1 不同数量级复合序列选择均匀性试验数据
运算数量级 | J | q=0 | q=1 | c=0 | c=1 |
1E3 | 10 | 504 | 496 | 474 | 526 |
1E4 | 10 | 4994 | 5006 | 4988 | 5012 |
1E5 | 10 | 50168 | 49832 | 49844 | 50156 |
1E6 | 10 | 500280 | 499720 | 498670 | 501330 |
1E7 | 10 | 4999689 | 5000311 | 4999794 | 5000206 |
1E8 | 10 | 49999878 | 50000122 | 49996352 | 50003648 |
编程实现符合混沌加解密过程
根据以下MATLAB代码编程实现图像加解密工作
示例代码如下所示:
%
% 复合混沌加、解密实战系统,主程序
%
% img = imread('dog.jpg');
img = imread('lena1.bmp');
img1 = FHHD(img,0.15624562,164,10);
img2 = FHHDJM(img1,0.15624562,164,10);
figure,subplot(1,3,1);
imshow(img);title('原始图像');
subplot(1,3,2);
imshow(img1);title('加密图像');
subplot(1,3,3);
imshow(img2);title('解密图像');
function [img1]=FHHD(img,x0,g0,j0)
%
% 复合混沌加密函数
%
[m,n,s] = size(img); %获取尺寸
img1 = img; %初始化加密之后图像
for i=1:s %依次对每个比特进行加密
for j=1:n
for k=1:m
for l=1:8
% 1、使用反馈移位寄存器依次输出ri
%使用本源多项式 x^7+x^3+1 抽头8、4、1位
ri = bitget(g0,1);
bit1 = bitget(g0,4);
bit2 = bitget(g0,8);
% 将抽头的三位进行异或得到新的最高位值newbit
newbit = bitxor(ri,bit1);
newbit = bitxor(newbit,bit2);
% 原始反馈移位寄存器g0右移一位
g0 = bitshift(g0,-1);
% 将g0最高位设置为计算得到的newbit
g0 = bitset(g0,8,newbit);
% 2、明文对应位与ri异或得到qi值
qi = bitxor(bitget(img(k,j,i),l),ri);
% 3、根据qi值用对应的混沌函数以及初始变量获得新的迭代混沌值
fx = 1-sqrt(abs(2*x0-1));
if(qi == 0)
fx = 1-fx;
end
% 更新x0的值
x0 = fx;
% 4、混沌值进行Rj非线性变换得到密文
img1(k,j,i) = bitset(img1(k,j,i),l,mod(floor(fx*2^j0),2));
end
end
end
end
imwrite(img1,'jmtx.bmp','BMP');
function [img1]=FHHDJM(img,x0,g0,j0)
%
% 复合混沌解密函数
%
[m,n,s] = size(img); %获取尺寸
img1 = img; %初始化加密之后图像
for i=1:s %依次对每个比特进行加密
for j=1:n
for k=1:m
for l=1:8
% 1、使用f1与初始x0计算混沌值
fx = 1-sqrt(abs(2*x0-1));
% 更新x0的值
x0 = fx;
% 2、混沌值进行Rj非线性变换得到si
si = mod(floor(fx*2^j0),2);
% 3、用1减去密文与si进行异或得到qi
% 高版本MATLAB可以直接使用下面的语句
%qi = 1-bitxor(bitget(img(k,j,i),l),si);
tmp=bitxor(bitget(img(k,j,i),l),si);
if tmp==1
qi=0;
else
qi=1;
end
% 4、使用反馈移位寄存器依次输出ri
% 使用本源多项式 x^7+x^3+1 抽头8、4、1位
ri = bitget(g0,1);
bit1 = bitget(g0,4);
bit2 = bitget(g0,8);
% 将抽头的三位进行异或得到新的最高位值newbit
newbit = bitxor(ri,bit1);
newbit = bitxor(newbit,bit2);
% 原始反馈移位寄存器g0右移一位
g0 = bitshift(g0,-1);
% 将g0最高位设置为计算得到的newbit
g0 = bitset(g0,8,newbit);
% 5、qi与ri的异或值得到明文
mi = bitxor(qi,ri);
img1(k,j,i) = bitset(img1(k,j,i),l,mi);
end
end
end
end
imwrite(img1,'gmtx.bmp','BMP');
原始图片:
加密后图片:
解密后图片: