传送门
- 文献原文可前往其收录处《混沌映射与比特重组的图像加密》.
- 文献的算法流程 (包括算法勘误, 算法整理) 可以参见博文《《混沌映射与比特重组的图像加密》(平萍等)一文的算法流程》.
- 对算法背后一些理论的分析可以参见博文《《混沌映射与比特重组的图像加密》(平萍等)一文的算法分析》.
- 对原文算法的改进可以参见博文《《混沌映射与比特重组的图像加密》(平萍等)一文的算法改进和展望》.
- 对算法及其改进形式的仿真实验可以参见博文《《混沌映射与比特重组的图像加密》(平萍等)一文的仿真实验 (基于Matlab)》.
- 对算法的其他性能分析可以参见博文《《混沌映射与比特重组的图像加密》(平萍等)一文的性能分析(一)-- 敏感性分析 (基于Matlab)》.
- 原文算法的实现可以参见博文《《混沌映射与比特重组的图像加密》(平萍等)一文的算法实现(基于Matlab)》.
相关m文件代码
性能分析m文件中使用到的函数m文件:
- tent_mapping_once.m
- henon_mapping_once.m
- henon_mappinginv_once.m
- cmbr_encryption.m
- cmbr_decryption.m
以上m文件的获取可前往博文《《混沌映射与比特重组的图像加密》(平萍等)一文的算法实现(基于Matlab)》, 或到博主的资源里下载( 资源名字为: 《混沌映射与比特重组的图像加密》工程文件.rar, 需1积分 ). 另在本文附两个额外需要的m文件代码.
计算相关系数的函数m文件 (r_xy_near.m)
function [ r_xy, X, Y ] = r_xy_near( I, n, direction )
% 参数说明
% I -- 输入的图像灰度矩阵
% n -- 在I中按照一定要求随机抽取的像素点的个数
% direction -- 将direction指定方向的像素作为相邻像素
% Left: 水平向左的像素
% Right: 水平向右的像素
% Down: 垂直向下的像素
% Up; 垂直向上的像素
% Left_Up: 对角线左上角的像素
% Left_Down: 对角线左下角的像素
% Right_Up: 对角线右上角的像素
% Right_Down: 对角线右下角的像素
% r_xy -- 最终计算得到的两个长度为n的向量X和Y之间的相关系数
% X -- 随机抽取的像素点的灰度值(向量)
% Y -- 随机抽取的像素点的相邻点的灰度值(向量)
I = double(I);
[H, W] = size(I);
% 根据direction参数确定随机取样点的横纵坐标范围
switch direction
case 'Left'
R = floor( unifrnd(1, H, [1, n]) );
C = floor( unifrnd(2, W, [1, n]) );
delta_r = 0; delta_c = -1;
case 'Right'
R = floor( unifrnd(1, H, [1, n]) );
C = floor( unifrnd(1, W-1, [1, n]) );
delta_r = 0; delta_c = 1;
case 'Up'
R = floor( unifrnd(2, H, [1, n]) );
C = floor( unifrnd(1, W, [1, n]) );
delta_r = -1; delta_c = 0;
case 'Down'
R = floor( unifrnd(1, H-1, [1, n]) );
C = floor( unifrnd(1, W, [1, n]) );
delta_r = 1; delta_c = 0;
case 'Left_Up'
R = floor( unifrnd(2, H, [1, n]) );
C = floor( unifrnd(2, W, [1, n]) );
delta_r = -1; delta_c = -1;
case 'Left_Down'
R = floor( unifrnd(1, H-1, [1, n]) );
C = floor( unifrnd(2, W, [1, n]) );
delta_r = 1; delta_c = -1;
case 'Right_Up'
R = floor( unifrnd(2, H, [1, n]) );
C = floor( unifrnd(1, W-1, [1, n]) );
delta_r = -1; delta_c = 1;
case 'Right_Down'
R = floor( unifrnd(1, H-1, [1, n]) );
C = floor( unifrnd(1, W-1, [1, n]) );
delta_r = 1; delta_c = 1;
end
X = []; Y = []; % 初始化随机取样点处的灰度值向量
for i = 1 : n
X(i) = I( R(i), C(i) );
Y(i) = I( R(i) + delta_r, C(i) + delta_c );
end
% 计算向量X与向量Y的相关系数
mx = mean(X); my = mean(Y);
cov_xy = mean( (X - mx) .* (Y - my) );
cov_x = mean( (X - mx) .* (X - mx) );
cov_y = mean( (Y - my) .* (Y - my) );
r_xy = cov_xy / sqrt( cov_x * cov_y );
end
性能分析的脚本m文件 (performance_analysis_2.m)
%% m文件说明
% 对《混沌映射与比特重组的图像加密》一文的图像加密算法和解密算法的性能分析
% 以下的每个分析都需要调用到独立的自定义函数文件cmbr_encryption.m, cmbr_decryption.m
%% 相邻像素的相关性分析
% 需要额外调用函数文件 r_xy_near.m
clear; clc; close all;
I = imread('fruit.png'); I = I(:, 1 : 323);
x0 = 0.234; S = 1280; n = 20000;
% direction = 'Left';
% direction = 'Right';
% direction = 'Up';
% direction = 'Down';
% direction = 'Left_Up';
% direction = 'Left_Down';
% direction = 'Right_Up';
direction = 'Right_Down';
[ r_xy_I, X_I, Y_I ] = r_xy_near( I, n, direction );
[ C, ~, ~ ] = cmbr_encryption( I, x0, S );
[ r_xy_C, X_C, Y_C ] = r_xy_near( C, n, direction );
figure, scatter( X_I, Y_I ); title(['明文图像', num2str(n), '对相邻像素的灰度值分布']);
xlabel('(x,y)的像素值'); ylabel('(x,y)的相邻像素值');
disp(['明文图像随机取', num2str(n), '对相邻像素计算得相关系数: ', num2str(r_xy_I)]);
figure, scatter( X_C, Y_C ); title(['密文图像', num2str(n), '对相邻像素的灰度值分布']);
xlabel('(x,y)的像素值'); ylabel('(x,y)的相邻像素值');
disp(['密文图像随机取', num2str(n), '对相邻像素计算得相关系数: ', num2str(r_xy_C)]);
%% 信息熵分析
% 对于一幅密文图像, 它的理想的信息熵的值是8.
% 调用Matlab自带函数entropy( )计算信息熵
clear; clc; close all;
I = imread('fruit.png'); I = I(:, 1 : 323);
x0 = 0.234; S = 1280;
[C, ~, ~] = cmbr_encryption( I, x0, S );
disp(['密文图像的信息熵为: ', num2str( entropy(C) )]);
%% 加解密时间随着尺寸的变化
clear; clc; close all;
x0 = 0.234; S = 1280;
size_sequence = 50 : 50 : 1000;
time_en = []; time_de = [];
for k = size_sequence
I = floor( rand(k, k) * 255 );
tic
[ C, ~, s ] = cmbr_encryption( I, x0, S );
toc
time_en = [time_en, toc];
tic
[ ~, ~ ] = cmbr_decryption( C, x0, s, S );
toc
time_de = [time_de, toc];
disp(['图像大小为: ', num2str(k), ' * ', num2str(k), '的加解密已完成']);
end
figure, plot(size_sequence, time_en, 'r');
title('加密算法用时与明文图像大小的关系曲线');
xlabel('明文图像大小'); ylabel('加密算法用时');
figure, plot(size_sequence, time_de, 'b');
title('解密算法用时与密文图像大小的关系曲线');
xlabel('密文图像大小'); ylabel('解密算法用时');
相邻像素相关性分析
评估指标
相邻像素的相关系数 r r r, 计算公式为
r x y = C o v ( x , y ) C o v ( x , x ) ⋅ C o v ( y , y ) , C o v ( x , y ) = 1 n ∑ i = 1 n ( x i − E ( x ) ) ( y i − E ( y ) ) , E ( x ) = 1 n ∑ i = 1 n x i . \begin{aligned} & {
{r}_{xy}}=\frac{Cov\left( x,y \right)}{Cov\left( x,x \right)\centerdot Cov\left( y,y \right)}, \\ & Cov\left( x,y \right)=\frac{1}{n}\sum\limits_{i=1}^{n}{\left( {
{x}_{i}}-E\left( x \right) \right)\left( {
{y}_{i}}-E\left( y \right) \right)}, \\ & E\left( x \right)=\frac{1}{n}\sum\limits_{i=1}^{n}{
{
{x}_{i}}}. \\ \end{aligned} rxy=Cov(x,x)⋅Cov(y,y)Cov(x,y),Cov(x,y)=n1i=1∑n(xi−E(x))(yi−E(y)),E(x)=n1i=1∑nxi.
其中 C o v ( x , y ) Cov\left( x,y \right) Cov(x,y)是向量 x x x与向量 y y y的协方差系数, x i , y i {
{x}_{i}},{
{y}_{i}} xi,yi是向量 x , y x,y x,y的每个分量, n n n是向量 x , y x,y x,y的长度, E ( x ) , E ( y ) E\left( x \right),E\left( y \right) E(x),E(y)就是向量 x , y x,y x,y各自的所有分量的均值. r x y {
{r}_{xy}} rxy的值介于 − 1 -1 −1到 1 1 1之间, 其绝对值 ∣ r x y ∣ \left| {
{r}_{xy}} \right| ∣rxy∣越接近 1 1 1, 表示向量 x , y x,y x,y的相关程度越大.
已知一般的明文图像像素在水平, 垂直, 或对角方向上高度相关, 在密文图像中, 相邻像素之间的相关性应该显著降低.
分析方法
使用以下的 323 × 323 323 \times 323 323×323的图片素材作为明文图像.
① 将上面的明文图像 I I I进行加密得到密文图像 C C C;
② 规定好相邻像素位于原像素的什么方向 (左方, 右方, 上方, 下方, 左上方, 左下方, 右上方, 右下方);
③ 随机在 I I I中抽取 n n n对相邻像素形成两个长度均为 n n n的向量 X 1 , Y 1 X_1,\text{ }Y_1 X1, Y1, 计算其相关系数 r 1 r_1 r1;
④ 对应地, 随机在 C C C中抽取 n n n对相邻像素形成两个长度均为 n n n的向量 X 2 , Y 2 X_2,\text{ }Y_2 X2, Y2, 计算其相关系数 r 2 r_2 r2, 然后与 r 1 r_1 r1进行对比.
以下令 n = 20000 n = 20000 n=20000.
实验结果
取向左的像素为相邻像素 |
取向左的像素为相邻像素 |
取向右的像素为相邻像素 |
取向右的像素为相邻像素 |
取向上的像素为相邻像素 |
取向上的像素为相邻像素 |
取向下的像素为相邻像素 |
取向下的像素为相邻像素 |
取左上角的像素为相邻像素 |
取左上角的像素为相邻像素 |
取左下角的像素为相邻像素 |
取左下角的像素为相邻像素 |
取右上角的像素为相邻像素 |
取右上角的像素为相邻像素 |
取右下角的像素为相邻像素 |
取右下角的像素为相邻像素 |
'Left'
明文图像随机取20000对相邻像素计算得相关系数: 0.97101
密文图像随机取20000对相邻像素计算得相关系数: 0.0045093
'Right'
明文图像随机取20000对相邻像素计算得相关系数: 0.97189
密文图像随机取20000对相邻像素计算得相关系数: -0.0059508
'Up'
明文图像随机取20000对相邻像素计算得相关系数: 0.96464
密文图像随机取20000对相邻像素计算得相关系数: -0.0044817
'Down'
明文图像随机取20000对相邻像素计算得相关系数: 0.96428
密文图像随机取20000对相邻像素计算得相关系数: 0.012069
'Left_Up'
明文图像随机取20000对相邻像素计算得相关系数: 0.94745
密文图像随机取20000对相邻像素计算得相关系数: -0.0022895
'Left_Down'
明文图像随机取20000对相邻像素计算得相关系数: 0.94837
密文图像随机取20000对相邻像素计算得相关系数: -0.0056973
'Right_Up'
明文图像随机取20000对相邻像素计算得相关系数: 0.94772
密文图像随机取20000对相邻像素计算得相关系数: 0.014249
'Right_Down'
明文图像随机取20000对相邻像素计算得相关系数: 0.94375
密文图像随机取20000对相邻像素计算得相关系数: -0.0023908
实验结果表明无论规定相邻像素位于原像素的哪个方向, 明文图像的相邻像素与原像素灰度值的二维分布呈现近似线性关系, 相关系数接近1; 而密文图像的相邻像素与原像素灰度值的二维分布非常均匀, 布满平面, 相关系数接近0. 因此加密算法满足零相关, 加密效果较好, 密文图像具有更低的像素相关性.
安全性强度
评估指标
信息熵, 一种用来检测加密系统安全性强度的参数, 计算公式为
H ( m ) = ∑ i = 0 2 N − 1 p ( m i ) log 2 1 p ( m i ) . H\left( m \right)=\sum\limits_{i=0}^{2N-1}{p\left( {
{m}_{i}} \right){
{\log }_{2}}\frac{1}{p\left( {
{m}_{i}} \right)}}. H(m)=i=0∑2N−1p(mi)log2p(mi)1.
式中, m i {
{m}_{i}} mi表示第 i i i位灰度级, m i = 0 , 1 , ⋯ , 255 {
{m}_{i}}=0,1,\cdots ,255 mi=0,1,⋯,255, p ( m i ) p\left( {
{m}_{i}} \right) p(mi)表示像素值为 m i {
{m}_{i}} mi的概率(一般当图像像素个数足够多时, 可用频率替代), N N N表示在密文图像中所有像素的个数.
对于一幅密文图像, 它的理想的信息熵的值为8, 在这种情况下, 密文图像就不会向那些试图获得没有授权访问的任何人泄露任何有用的信息.
分析方法
使用以下的 323 × 323 323 \times 323 323×323的图片素材作为明文图像, 对其进行加密得到密文图像, 计算密文图像的信息熵.
实验结果
密文图像的信息熵为: 7.9982
密文图像的信息熵非常接近8, 表明加密算法在进行对图像加密的过程中可以避免发生信息泄露, 图像加密算法具有良好的抗熵值分析攻击.
图像大小与计算用时曲线
抛开对加密算法进行理论上的复杂度分析(复杂度分析可以参考原论文), 我们想简单研究在同一台计算机上, 保持密钥和其他条件不变, 加密算法用时与输入的明文图像大小的关系. 为了方便, 我们规定输入的明文图像的大小是 N × N N \times N N×N的. 令 N = 50 , 100 , 150 , ⋯ , 1000 N=50,\text{ }100,\text{ }150,\text{ }\cdots ,\text{ }1000 N=50, 100, 150, ⋯, 1000, 计算加密算法用时得到的结果如下.
历时 0.549801 秒。
历时 0.547340 秒。
图像大小为: 50 * 50的加解密已完成
历时 1.837155 秒。
历时 1.809797 秒。
图像大小为: 100 * 100的加解密已完成
历时 4.154024 秒。
历时 4.064169 秒。
图像大小为: 150 * 150的加解密已完成
历时 7.362790 秒。
历时 7.058512 秒。
图像大小为: 200 * 200的加解密已完成
历时 11.549046 秒。
历时 11.026304 秒。
图像大小为: 250 * 250的加解密已完成
历时 17.058409 秒。
历时 15.857187 秒。
图像大小为: 300 * 300的加解密已完成
历时 22.856086 秒。
历时 21.770861 秒。
图像大小为: 350 * 350的加解密已完成
历时 30.244508 秒。
历时 28.422448 秒。
图像大小为: 400 * 400的加解密已完成
历时 38.321001 秒。
历时 36.493705 秒。
图像大小为: 450 * 450的加解密已完成
历时 47.782701 秒。
历时 44.477456 秒。
图像大小为: 500 * 500的加解密已完成
历时 58.232867 秒。
历时 54.052163 秒。
图像大小为: 550 * 550的加解密已完成
历时 69.501967 秒。
历时 64.052201 秒。
图像大小为: 600 * 600的加解密已完成
历时 81.940872 秒。
历时 75.634364 秒。
图像大小为: 650 * 650的加解密已完成
历时 95.774720 秒。
历时 87.555124 秒。
图像大小为: 700 * 700的加解密已完成
历时 111.549318 秒。
历时 101.265168 秒。
图像大小为: 750 * 750的加解密已完成
历时 126.735671 秒。
历时 114.441286 秒。
图像大小为: 800 * 800的加解密已完成
历时 144.922362 秒。
历时 129.592058 秒。
图像大小为: 850 * 850的加解密已完成
历时 163.219478 秒。
历时 144.857971 秒。
图像大小为: 900 * 900的加解密已完成
历时 182.688934 秒。
历时 160.887248 秒。
图像大小为: 950 * 950的加解密已完成
历时 201.769145 秒。
历时 179.507409 秒。
图像大小为: 1000 * 1000的加解密已完成
用时-尺寸曲线与原文分析得到的复杂度
O ( 8 × N 2 + ( 8 × N ) 2 + N 2 + 8 × N 2 ) = O ( 81 N 2 ) = O ( N 2 ) . O\left( 8\times {
{N}^{2}}+{
{\left( 8\times N \right)}^{2}}+{
{N}^{2}}+8\times {
{N}^{2}} \right)=O\left( 81{
{N}^{2}} \right)=O\left( {
{N}^{2}} \right). O(8×N2+(8×N)2+N2+8×N2)=O(81N2)=O(N2).
是很吻合的.