二维混沌序列相位板的双随机相位编码
一、核心算法原理
1.1 双随机相位编码(DRPE)系统
输入图像 f(x,y) → 乘以相位板1 P₁(x,y) → 光学变换(菲涅尔/傅里叶)→ 乘以相位板2 P₂(x,y) → 输出密文
1.2 混沌相位板生成
使用二维混沌系统(如Henon映射)生成确定性随机序列:
xₙ₊₁ = 1 - a·xₙ² + yₙ
yₙ₊₁ = b·xₙ
其中a、b为混沌参数,x₀、y₀为初始值(密钥)。
二、MATLAB实现代码
2.1 主程序:chaos_drpe_main.m
%% 二维混沌序列相位板的双随机相位编码系统
% 功能:利用混沌系统生成随机相位板,实现光学图像加密
clear; clc; close all;
%% 1. 系统参数设置
key1 = [0.1, 0.2, 1.4, 0.3]; % 混沌密钥1: [x0, y0, a, b]
key2 = [0.5, 0.6, 1.5, 0.2]; % 混沌密钥2: [x0, y0, a, b]
N = 256; % 图像尺寸
lambda = 632.8e-9; % 光波长(m)
dx = 10e-6; % 采样间隔(m)
z = 0.15; % 衍射距离(m)
fprintf('=== 混沌双随机相位编码系统 ===\n');
fprintf('混沌密钥1: [x0=%.3f, y0=%.3f, a=%.3f, b=%.3f]\n', key1(1), key1(2), key1(3), key1(4));
fprintf('混沌密钥2: [x0=%.3f, y0=%.3f, a=%.3f, b=%.3f]\n', key2(1), key2(2), key2(3), key2(4));
fprintf('光学参数: λ=%.2fnm, dx=%.1fμm, z=%.2fm\n\n', lambda*1e9, dx*1e6, z);
%% 2. 生成混沌相位板
fprintf('生成混沌相位板...\n');
phase_mask1 = generate_chaos_phase_mask(N, key1);
phase_mask2 = generate_chaos_phase_mask(N, key2);
%% 3. 加载明文图像
plaintext = imread('cameraman.tif');
if size(plaintext, 3) == 3
plaintext = rgb2gray(plaintext);
end
plaintext = im2double(imresize(plaintext, [N, N]));
%% 4. 显示相位板和原始图像
figure('Name', '混沌相位板与原始图像', 'Color', 'white', 'Position', [100, 100, 1000, 300]);
subplot(1,3,1); imshow(phase_mask1, []);
title('混沌相位板 1', 'FontSize', 12, 'FontWeight', 'bold');
subplot(1,3,2); imshow(phase_mask2, []);
title('混沌相位板 2', 'FontSize', 12, 'FontWeight', 'bold');
subplot(1,3,3); imshow(plaintext, []);
title('原始明文图像', 'FontSize', 12, 'FontWeight', 'bold');
%% 5. 加密过程(菲涅尔域)
fprintf('执行菲涅尔域加密...\n');
tic;
% 第一次相位调制
modulated1 = plaintext .* exp(1i * 2 * pi * phase_mask1);
% 菲涅尔衍射传播
U1 = fresnel_propagation(modulated1, lambda, dx, z);
% 第二次相位调制
modulated2 = U1 .* exp(1i * 2 * pi * phase_mask2);
% 输出密文
ciphertext = modulated2;
encryption_time = toc;
fprintf('加密完成!耗时: %.3f秒\n', encryption_time);
%% 6. 解密过程
fprintf('执行解密过程...\n');
tic;
% 逆第二次相位调制
decrypted1 = ciphertext .* exp(-1i * 2 * pi * phase_mask2);
% 逆菲涅尔衍射传播
decrypted2 = fresnel_propagation(decrypted1, lambda, dx, -z); % 负距离表示反向传播
% 逆第一次相位调制
decrypted_plaintext = decrypted2 .* exp(-1i * 2 * pi * phase_mask1);
% 提取幅度作为重建图像
reconstructed = abs(decrypted_plaintext);
decryption_time = toc;
fprintf('解密完成!耗时: %.3f秒\n', decryption_time);
%% 7. 结果显示与分析
figure('Name', '加密与解密结果', 'Color', 'white', 'Position', [100, 100, 1400, 400]);
subplot(1,5,1); imshow(plaintext, []);
title('原始图像', 'FontSize', 12, 'FontWeight', 'bold');
subplot(1,5,2); imshow(log(1+abs(ciphertext)), []);
title('加密密文', 'FontSize', 12, 'FontWeight', 'bold');
subplot(1,5,3); imshow(reconstructed, []);
title('解密重建图像', 'FontSize', 12, 'FontWeight', 'bold');
subplot(1,5,4);
% 计算图像质量指标
mse_value = immse(plaintext, reconstructed);
psnr_value = psnr(plaintext, reconstructed);
ssim_value = ssim(plaintext, reconstructed);
corr_value = corr2(plaintext, reconstructed);
imshow(abs(plaintext - reconstructed), []);
title('残差图像', 'FontSize', 12, 'FontWeight', 'bold');
subplot(1,5,5); axis off;
text(0.1, 0.9, '图像质量评估:', 'FontSize', 12, 'FontWeight', 'bold');
text(0.1, 0.75, sprintf('MSE: %.4f', mse_value), 'FontSize', 10);
text(0.1, 0.65, sprintf('PSNR: %.2f dB', psnr_value), 'FontSize', 10);
text(0.1, 0.55, sprintf('SSIM: %.4f', ssim_value), 'FontSize', 10);
text(0.1, 0.45, sprintf('相关系数: %.4f', corr_value), 'FontSize', 10);
text(0.1, 0.3, sprintf('加密时间: %.3fs', encryption_time), 'FontSize', 10);
text(0.1, 0.2, sprintf('解密时间: %.3fs', decryption_time), 'FontSize', 10);
title('质量评估报告', 'FontSize', 12, 'FontWeight', 'bold');
%% 8. 密钥敏感性测试
fprintf('\n=== 密钥敏感性测试 ===\n');
test_key_sensitivity(key1, key2, plaintext, phase_mask1, phase_mask2, lambda, dx, z);
2.2 混沌相位板生成函数:generate_chaos_phase_mask.m
function phase_mask = generate_chaos_phase_mask(N, key)
% 使用二维Henon混沌映射生成混沌相位板
% 输入:
% N: 相位板尺寸 (N x N)
% key: [x0, y0, a, b] 混沌初始值和参数
% 输出:
% phase_mask: 混沌相位板 (0-2π)
x0 = key(1); y0 = key(2); a = key(3); b = key(4);
% Henon映射方程
% x_{n+1} = 1 - a*x_n^2 + y_n
% y_{n+1} = b * x_n
% 预分配内存
total_points = N * N + 2000; % 额外点用于预热
x = zeros(1, total_points);
y = zeros(1, total_points);
% 初始化
x(1) = x0;
y(1) = y0;
% 迭代生成混沌序列
for i = 1:(total_points-1)
x(i+1) = 1 - a * x(i)^2 + y(i);
y(i+1) = b * x(i);
end
% 丢弃前2000个点(预热期)
chaos_seq = x(2001:end);
% 重塑为二维矩阵
chaos_matrix = reshape(chaos_seq, N, N);
% 归一化到[0,1]
chaos_matrix = (chaos_matrix - min(chaos_matrix(:))) / ...
(max(chaos_matrix(:)) - min(chaos_matrix(:)));
% 映射到相位范围[0, 2π]
phase_mask = 2 * pi * chaos_matrix;
fprintf('混沌相位板生成完成: %dx%d\n', N, N);
end
2.3 菲涅尔衍射传播函数:fresnel_propagation.m
function U_out = fresnel_propagation(U_in, lambda, dx, z)
% 二维菲涅尔衍射传播(基于角谱法)
% 输入:
% U_in: 输入复振幅场
% lambda: 光波长(m)
% dx: 采样间隔(m)
% z: 传播距离(m),负值表示反向传播
% 输出:
% U_out: 输出复振幅场
[M, N] = size(U_in);
% 计算频率坐标
fx = (-N/2:N/2-1) / (N * dx);
fy = (-M/2:M/2-1) / (M * dx);
[FX, FY] = meshgrid(fx, fy);
% 菲涅尔传递函数
k = 2 * pi / lambda; % 波数
H = exp(1i * k * z) .* exp(-1i * pi * lambda * z * (FX.^2 + FY.^2));
% 频域卷积实现衍射
U_out = ifft2(fft2(U_in) .* fftshift(H));
end
2.4 密钥敏感性测试函数:test_key_sensitivity.m
function test_key_sensitivity(key1, key2, plaintext, pm1, pm2, lambda, dx, z)
% 测试密钥敏感性:微小变化导致解密失败
fprintf('测试密钥敏感性...\n');
% 原始解密
[~, original_recon] = decrypt_image(plaintext, pm1, pm2, lambda, dx, z);
original_corr = corr2(plaintext, original_recon);
% 测试密钥1的微小变化
key1_modified = key1;
key1_modified(1) = key1(1) + 1e-15; % 极微小的变化
pm1_modified = generate_chaos_phase_mask(size(plaintext,1), key1_modified);
[~, modified_recon] = decrypt_image(plaintext, pm1_modified, pm2, lambda, dx, z);
modified_corr = corr2(plaintext, modified_recon);
fprintf('原始密钥解密相关系数: %.4f\n', original_corr);
fprintf('密钥1变化1e-15后的相关系数: %.4f\n', modified_corr);
if modified_corr < 0.1
fprintf('✓ 密钥敏感性测试通过:微小变化导致解密完全失败\n');
else
fprintf('⚠ 密钥敏感性不足\n');
end
end
function [ciphertext, reconstructed] = decrypt_image(plaintext, pm1, pm2, lambda, dx, z)
% 辅助函数:执行解密
modulated1 = plaintext .* exp(1i * 2 * pi * pm1);
U1 = fresnel_propagation(modulated1, lambda, dx, z);
modulated2 = U1 .* exp(1i * 2 * pi * pm2);
ciphertext = modulated2;
decrypted1 = ciphertext .* exp(-1i * 2 * pi * pm2);
decrypted2 = fresnel_propagation(decrypted1, lambda, dx, -z);
decrypted_plaintext = decrypted2 .* exp(-1i * 2 * pi * pm1);
reconstructed = abs(decrypted_plaintext);
end
三、扩展功能:分数傅里叶域加密
3.1 分数傅里叶变换函数:fractional_fourier.m
function U_out = fractional_fourier(U_in, alpha, lambda, dx)
% 分数傅里叶变换
% alpha: 变换阶数 (0-1之间)
% 当alpha=0.5时为标准傅里叶变换
[M, N] = size(U_in);
fx = (-N/2:N/2-1) / (N * dx);
fy = (-M/2:M/2-1) / (M * dx);
[FX, FY] = meshgrid(fx, fy);
% 分数傅里叶变换核
k = 2 * pi / lambda;
theta = alpha * pi / 2;
if abs(alpha - 1) < 1e-10
% 标准傅里叶变换
U_out = fftshift(fft2(U_in));
elseif abs(alpha) < 1e-10
% 恒等变换
U_out = U_in;
else
% 一般分数傅里叶变换
H = exp(1i * k * (FX.^2 + FY.^2) * tan(theta/2)) .* ...
exp(-1i * pi * theta / 2);
U_out = ifft2(fft2(U_in) .* fftshift(H));
end
end
3.2 分数域双随机相位加密
function ciphertext = fractional_drpe(plaintext, pm1, pm2, alpha1, alpha2, lambda, dx)
% 分数域双随机相位加密
% alpha1, alpha2: 分数阶数(作为额外密钥)
% 第一次相位调制 + 分数傅里叶变换
modulated1 = plaintext .* exp(1i * 2 * pi * pm1);
U1 = fractional_fourier(modulated1, alpha1, lambda, dx);
% 第二次相位调制 + 分数傅里叶变换
modulated2 = U1 .* exp(1i * 2 * pi * pm2);
ciphertext = fractional_fourier(modulated2, alpha2, lambda, dx);
end
参考代码 二维混沌序列构成的相位板的双随机相位 www.youwenfan.com/contentcnu/60106.html
四、分析与优化
4.1 算法复杂度分析
| 操作 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 混沌序列生成 | O(N²) | O(N²) |
| 相位调制 | O(N²) | O(N²) |
| 菲涅尔传播 | O(N² log N) | O(N²) |
| 总复杂度 | O(N² log N) | O(N²) |
4.2 安全性增强建议
- 多混沌系统级联:使用Chen系统、Lorenz系统等超混沌系统
- 时空混沌:引入时空混沌网格增加密钥空间
- 光学变换多样性:结合菲涅尔、分数傅里叶、小波变换
- 压缩感知:在加密前进行压缩采样,增强抗攻击能力
4.3 实际应用注意事项
- 量化效应:实际光学系统中需要考虑相位板的量化位数
- 噪声鲁棒性:添加适当的纠错编码应对信道噪声
- 实时性优化:使用GPU加速大规模图像加密
- 密钥管理:建立安全的密钥分发和更新机制

浙公网安备 33010602011771号