【图像加密】基于无限变换和闭环控制扩散的图像加密算法加密彩色图像附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、引言
随着信息技术的飞速发展,图像数据在网络中的传输和存储日益频繁,图像信息的安全保护变得至关重要。传统的图像加密方法在面对日益强大的攻击手段时,逐渐暴露出安全性不足等问题。基于无限变换和闭环控制扩散的图像加密算法为彩色图像加密提供了一种新的思路,通过复杂的变换和扩散机制,增强图像加密的安全性。
二、算法原理
- 无限变换
:该算法中的无限变换基于混沌系统或其他复杂的数学变换。混沌系统具有对初始条件敏感、长期行为不可预测等特性。以 Logistic 混沌映射为例,其迭代公式为 xn+1=μxn(1−xn),其中 μ 为控制参数,xn 为当前迭代值。通过适当选择 μ 的值(如 μ=4 时系统处于混沌状态),初始值 x0 的微小变化会导致后续迭代值的巨大差异。将混沌系统生成的混沌序列与图像像素进行结合,实现对图像像素位置的无限次动态变换。例如,可以利用混沌序列对图像的行和列进行随机置换,每次置换的规则都由混沌序列动态决定,使得图像像素的位置在多次变换后难以预测。
- 闭环控制扩散
:闭环控制扩散是在图像像素值上进行操作。首先,选择一个初始的扩散种子,它可以是根据图像内容或密钥生成的一个数值。基于这个种子,按照特定的扩散规则对图像像素值进行扩散。例如,从图像的左上角像素开始,根据种子值和预先设定的扩散函数,计算该像素与相邻像素值之间的变换关系,将计算结果反馈到下一个像素的扩散计算中,形成闭环控制。这样,一个像素值的改变会通过扩散机制逐渐影响到整个图像的像素值,使得密文图像的像素值与明文图像的像素值之间呈现出高度的相关性,增加了密码分析的难度。
三、彩色图像加密流程
- 图像预处理
:将彩色图像分解为红(R)、绿(G)、蓝(B)三个颜色通道。这是因为彩色图像通常由这三个通道组成,分别处理每个通道可以更细致地对图像进行加密操作。对每个通道的图像进行归一化处理,将像素值范围映射到 [0, 1] 区间,便于后续与混沌序列等进行数值运算。
- 密钥生成
:生成一组与加密过程紧密相关的密钥。密钥可以包括混沌系统的初始值、控制参数,以及闭环控制扩散中的种子值等。密钥的生成可以基于用户输入的密码、系统时间或其他随机因素,确保每次加密的密钥具有随机性和唯一性。例如,利用哈希函数对用户输入的密码进行处理,生成混沌系统所需的初始值和控制参数,以增加密钥的安全性和不可预测性。
- 无限变换阶段
:对于每个颜色通道的图像,利用生成的混沌序列进行无限变换。如前所述,通过混沌序列对图像像素位置进行多次随机置换。每次置换时,根据混沌序列的值确定置换的方向和幅度。例如,根据混沌序列中的一个值确定是对行进行置换还是对列进行置换,以及置换的步长等。这样,每个颜色通道的图像像素位置在多次变换后变得杂乱无章。
- 闭环控制扩散阶段
:在无限变换后的每个颜色通道图像上进行闭环控制扩散。以每个通道的左上角像素为起始点,根据闭环控制扩散的种子值和预先定义的扩散函数,对像素值进行扩散。例如,定义扩散函数为 Pi,j=(Pi,j+k×Pi−1,j−1)mod1,其中 Pi,j 是当前像素值,Pi−1,j−1 是左上角相邻像素值,k 是由种子值和混沌序列共同决定的系数,mod1 操作保证像素值仍在 [0, 1] 范围内。通过这种方式,从一个像素开始,逐渐将其值的变化扩散到整个图像,使得每个像素值都与其他多个像素值相关联。
- 图像合成
:对经过无限变换和闭环控制扩散后的红、绿、蓝三个颜色通道图像进行合成,得到加密后的彩色图像。将三个通道的像素值按照彩色图像的格式进行组合,例如,对于每个像素位置 (i,j),将红通道的 Ri,j、绿通道的 Gi,j 和蓝通道的 Bi,j 组合成彩色像素 (Ri,j,Gi,j,Bi,j),形成最终的加密图像。
⛳️ 运行结果
📣 部分代码
case 'SHA384'
meth='SHA-384';
case 'SHA512'
meth='SHA-512';
otherwise
end
algs={'MD2','MD5','SHA-1','SHA-256','SHA-384','SHA-512'};
if isempty(strmatch(meth,algs,'exact'))
error(['Hash algorithm must be ' ...
'MD2, MD5, SHA-1, SHA-256, SHA-384, or SHA-512']);
end
% create hash
x=java.security.MessageDigest.getInstance(meth);
x.update(inp);
h=typecast(x.digest,'uint8');
h=dec2hex(h)';
if(size(h,1))==1 % remote possibility: all hash bytes < 128, so pad:
h=[repmat('0',[1 size(h,2)]);h];
end
h=lower(h(:)');
clear x
return
