基于双随机相位与菲涅尔变换的无透镜光学加密Matlab仿真实现

发布时间:2026/7/4 4:31:40
基于双随机相位与菲涅尔变换的无透镜光学加密Matlab仿真实现 1. 项目概述当光学加密遇上数字仿真最近在整理一些关于信息安全和光学图像处理的资料发现一个挺有意思的交叉点无透镜光学加密。这玩意儿听起来有点玄乎但核心思想其实很直观——它借鉴了传统光学全息加密的物理原理但完全在数字域比如你的电脑里用算法模拟实现从而绕开了搭建复杂、昂贵且不易调整的光学实验平台的麻烦。对于做图像安全、信息隐藏或者单纯对光学计算感兴趣的朋友来说这是一个非常值得动手实践的项目。这次要聊的具体实现是基于双随机相位结构结合菲涅尔变换的无透镜光学加密解密系统。简单来说它的目标就是把你的一张明文图片比如一张设计图、一份证件照通过一套模拟光学变换的数学操作变成一堆看起来完全随机、像噪声一样的密文图像。没有正确的“钥匙”即加密时使用的特定参数几乎不可能从这堆噪声中还原出原始图像。而整个过程的仿真我们完全可以在Matlab这个强大的数学工具里完成。这意味着你不需要激光器、空间光调制器这些专业设备坐在电脑前就能研究和体验光学加密的魅力。这套方法特别适合谁呢如果你是电子信息、光学工程、计算机科学相关专业的学生或研究者想找一个既有理论深度又有实践乐趣的课题或者你是对图像加密算法感兴趣的开发者想了解一种不同于纯数学密码学如AES、RSA的物理层加密思路亦或是你正在寻找一个综合运用傅里叶变换、相位调制等数字图像处理技术的Matlab练手项目那么这个内容都会给你带来不少启发和干货。2. 核心原理与方案设计拆解要理解这个加密系统我们得先把它拆解成几个核心的模块来看。整个流程可以看作是对原始图像进行了一系列的“扭曲”和“搅拌”而双随机相位板和菲涅尔变换就是实现这些操作的关键工具。2.1 为什么是“双随机相位”结构在光学信息处理中相位是一个极其重要的维度。与只记录光强的普通照片不同相位信息包含了光波传播的方向和波前形状。随机相位板的作用可以想象成是一块表面高度完全随机起伏的毛玻璃。当光波通过它时波前会被彻底打乱产生一个随机的相位分布。那么为什么需要“双”随机相位板呢这主要基于两个考量增强密钥空间和实现非线性混合。单相位调制的局限性如果只使用一块随机相位板对图像进行调制其加密效果本质上是一种线性操作。在特定的攻击方法如已知明文攻击下其安全性可能不足。此外密钥即那一块相位板的分布相对单一。双相位结构的优势引入两块独立的随机相位板分别放置在输入平面和变换平面通常是傅里叶平面或菲涅尔衍射平面。第一块板对原始图像进行第一次相位扰乱第二块板在频域或衍射域进行第二次扰乱。这两次扰乱是级联的、非线性的尤其是在结合了菲涅尔变换的二次相位因子后使得明文、密文和密钥之间的关系变得极为复杂。攻击者即使获取了密文在不知道两块相位板具体分布的情况下也无法进行有效的逆向工程。这两块相位板的随机分布共同构成了加密系统的核心密钥极大地扩展了密钥空间。2.2 菲涅尔变换扮演什么角色菲涅尔变换是描述光波在自由空间中近场衍射的数学模型。相比于更常见的傅里叶变换描述远场夫琅禾费衍射菲涅尔变换引入了与传播距离相关的二次相位因子。在这个加密系统中采用菲涅尔变换主要有三个好处增加加密维度传播距离z本身可以作为一个额外的密钥参数。即使攻击者猜到了相位板的可能模式如果不知道正确的衍射距离z也无法正确解密。增强非线性菲涅尔变换的二次相位因子与随机相位板相乘进一步增强了整个变换的非线性特性提升了对抗各种密码分析攻击的能力。更贴近物理实现虽然我们做的是无透镜数字仿真但算法模型本身是对物理光学加密过程的精确模拟。采用菲涅尔变换使得这个数字模型与实际的激光、透镜、CCD采集等光学加密系统在原理上保持一致仿真结果更具参考价值。2.3 整体加密解密流程设计基于以上原理我们可以勾勒出系统的整体框图加密过程输入原始明文图像I(x, y)。第一次相位调制将图像与第一块随机相位板RP1(x, y)相乘。RP1的每个像素值是exp(j * 2π * n1(x, y))其中n1是在[0, 1)区间均匀分布的随机矩阵。第一次菲涅尔变换对调制后的复振幅场进行距离为z1的菲涅尔变换得到第一个衍射平面的复振幅分布。第二次相位调制将上一步的结果与第二块随机相位板RP2(u, v)相乘。RP2的生成方式同RP1但随机种子不同。第二次菲涅尔变换对再次调制后的复振幅场进行距离为z2的菲涅尔变换。输出密文取第二次菲涅尔变换结果的幅度或强度作为最终的密文图像C(x’, y’)。有时为了存储和传输方便也可能取相位或实部/虚部但幅度是最常见的。解密过程解密是加密的逆过程但需要注意的是由于我们最终输出的是幅度强度信息丢失了相位所以标准的菲涅尔变换是不可逆的。因此在解密时我们需要一个迭代相位恢复算法如Gerchberg-Saxton算法及其变种或利用全息记录的思想假设我们同时记录了幅度和相位但在无透镜系统中这需要特殊设计。更常见的简化仿真方法是在加密端我们保存下第二次菲涅尔变换后的完整复振幅信息包括幅度和相位然后在解密端直接对此复振幅进行逆向的菲涅尔变换和相位板共轭调制。简化解密步骤已知完整复振幅密文E(x’, y’)输入加密端保存的复振幅密文E(x’, y’)。第一次逆菲涅尔变换对E进行距离为-z2的菲涅尔变换或正向变换的逆运算。第二次相位解调将结果与第二块随机相位板RP2(u, v)的复共轭相乘。第二次逆菲涅尔变换进行距离为-z1的菲涅尔变换。第一次相位解调将结果与第一块随机相位板RP1(x, y)的复共轭相乘。输出明文取最终结果的幅度即得到解密后的图像I(x, y)。注意在实际的无透镜光学加密系统中如何同时获取衍射场的幅度和相位是一个关键问题通常需要借助相移干涉术、传输强度方程TIE等相位恢复技术。在我们的数字仿真中可以暂时绕过这个物理难题专注于算法流程的验证即假设我们能够完美记录复振幅。3. Matlab实现核心细节解析理论清晰后用Matlab将其实现出来就是水到渠成的事情。下面我们分模块解析代码实现的关键点。3.1 随机相位板的生成与管理随机相位板是系统的密钥其生成必须满足可重现性用于解密和随机性。function phase_mask generate_random_phase_mask(rows, cols, seed) % 生成一个 [rows x cols] 的随机相位板 % seed: 随机数种子用于确保加解密时使用相同的相位板 rng(seed); % 设置随机数种子 random_matrix rand(rows, cols); % 生成[0,1)均匀分布随机数 phase_mask exp(1i * 2 * pi * random_matrix); % 转换为复指数形式 exp(j*phi) end实操要点种子是关键seed参数至关重要。加密和解密时必须使用相同的种子来生成RP1和RP2否则无法正确解密。可以将seed1,seed2作为密钥的一部分保存。矩阵大小相位板的大小需要与待加密图像一致。如果图像是MxN相位板也应是MxN。数据类型相位板是复数矩阵每个元素的模为1。3.2 菲涅尔变换的数字实现菲涅尔变换可以通过卷积法或角谱法实现。角谱法在数字计算中更精确因为它直接基于傅里叶变换能准确满足波动方程的边界条件。function output fresnel_transform(input, lambda, z, dx, dy) % 使用角谱法实现菲涅尔变换 % input: 输入复振幅场 % lambda: 光波长 % z: 传播距离 % dx, dy: 输入平面采样间隔像素尺寸 [M, N] size(input); % 生成频域坐标 fx (-N/2 : N/2-1) / (N * dx); % x方向空间频率 fy (-M/2 : M/2-1) / (M * dy); % y方向空间频率 [FX, FY] meshgrid(fx, fy); % 角谱传递函数 H exp(1i * 2 * pi * z / lambda .* sqrt(1 - (lambda*FX).^2 - (lambda*FY).^2)); % 处理可能出现的虚数区域对应倏逝波通常直接置零或忽略 H(imag(H) ~ 0) 0; % 将输入场进行傅里叶变换并移到频域中心 F_input fftshift(fft2(ifftshift(input))); % 应用传递函数 F_output F_input .* H; % 逆变换回空间域 output fftshift(ifft2(ifftshift(F_output))); end参数选择与计算波长lambda通常选择可见光波长如 632.8e-9 米氦氖激光。它是一个重要的密钥参数。传播距离zz1和z2。距离的选择会影响衍射图样。太近z太小衍射效应不明显太远则可能超出角谱法的有效范围满足傍轴近似。一般选择z在几倍到几十倍于图像尺寸的范围内进行测试。例如若图像宽度N*dx约为 1cmz可选 5cm 到 20cm。采样间隔dx,dy这对应于数字图像中每个像素代表的物理尺寸。假设你的图像是512x512像素想模拟一个1cm x 1cm的物体那么dx dy 1e-2 / 512 ≈ 1.95e-5 m。这个参数需要与lambda和z协调以满足采样定理避免混叠。避坑指南角谱法中的传递函数H在sqrt(1 - (lambda*fx)^2 - (lambda*fy)^2)为虚数时对应着空间频率过高、无法传播的倏逝波。在数字计算中直接使用这个公式可能导致这些高频分量产生巨大的虚部破坏结果。常见的处理方法是将其幅度置零H(imag(H)~0)0;或者直接使用傍轴近似的二次相位形式H exp(1i * pi * lambda * z * (FX.^2 FY.^2))。后者计算更快但在z较小或数值孔径较大时误差较大。3.3 完整的加密与解密函数封装将上述模块组合起来形成完整的加解密流程。function [ciphertext, cipher_complex] double_random_phase_encrypt(plaintext, lambda, z1, z2, dx, dy, seed1, seed2) % 加密函数 % plaintext: 输入灰度图像double类型值域[0,1] % ciphertext: 输出的密文幅度图 % cipher_complex: 输出的密文复振幅用于解密 [M, N] size(plaintext); % 1. 生成随机相位板 RP1 generate_random_phase_mask(M, N, seed1); RP2 generate_random_phase_mask(M, N, seed2); % 2. 第一次相位调制 U1 plaintext .* RP1; % 3. 第一次菲涅尔变换 U2 fresnel_transform(U1, lambda, z1, dx, dy); % 4. 第二次相位调制 U3 U2 .* RP2; % 5. 第二次菲涅尔变换 U4 fresnel_transform(U3, lambda, z2, dx, dy); % 6. 输出 ciphertext abs(U4); % 密文幅度 cipher_complex U4; % 保存复振幅供解密用 end function decrypted double_random_phase_decrypt(cipher_complex, lambda, z1, z2, dx, dy, seed1, seed2) % 解密函数需要加密端保存的复振幅 [M, N] size(cipher_complex); % 生成与加密时相同的相位板 RP1 generate_random_phase_mask(M, N, seed1); RP2 generate_random_phase_mask(M, N, seed2); % 1. 第一次逆菲涅尔变换 (传播 -z2) U3_rev fresnel_transform(cipher_complex, lambda, -z2, dx, dy); % 2. 与RP2的复共轭相乘解调 U2_rev U3_rev .* conj(RP2); % 3. 第二次逆菲涅尔变换 (传播 -z1) U1_rev fresnel_transform(U2_rev, lambda, -z1, dx, dy); % 4. 与RP1的复共轭相乘解调 U0_rev U1_rev .* conj(RP1); % 5. 取幅度得到解密图像 decrypted abs(U0_rev); end4. 仿真实验与结果分析有了代码我们就可以进行仿真实验直观地看看加密解密效果如何。4.1 实验环境与参数设置假设我们使用一张512x512的灰度“Lena”标准测试图像。% 参数设置 lambda 632.8e-9; % 波长单位米 z1 0.05; % 第一次衍射距离5厘米 z2 0.08; % 第二次衍射距离8厘米 dx 10e-6; % 像素物理尺寸10微米 (假设SLM像元尺寸) dy 10e-6; seed1 2024; % 随机种子1 seed2 1024; % 随机种子2 % 读取并归一化图像 plain_img im2double(imread(lena512.bmp)); if size(plain_img,3)3 plain_img rgb2gray(plain_img); end % 执行加密 [cipher_amp, cipher_complex] double_random_phase_encrypt(plain_img, lambda, z1, z2, dx, dy, seed1, seed2); % 执行解密使用保存的复振幅 decrypted_img double_random_phase_decrypt(cipher_complex, lambda, z1, z2, dx, dy, seed1, seed2);4.2 加密与解密效果可视化我们需要对比原始图像、密文图像和解密图像。figure; subplot(1,3,1); imshow(plain_img); title(原始明文图像); subplot(1,3,2); imshow(cipher_amp, []); title(加密后密文幅度); subplot(1,3,3); imshow(decrypted_img, []); title(解密后图像); % 计算解密图像与原始图像的均方误差(MSE)和峰值信噪比(PSNR) mse_val sum(sum((plain_img - decrypted_img).^2)) / (512*512); psnr_val 10 * log10(1^2 / mse_val); % 假设最大像素值为1 fprintf(解密图像MSE: %.6f\n, mse_val); fprintf(解密图像PSNR: %.2f dB\n, psnr_val);预期结果密文图像看起来应该像均匀的白噪声没有任何原始图像的结构特征。这表明加密算法有效地隐藏了信息。解密图像如果所有参数lambda,z1,z2,seed1,seed2,dx,dy完全正确解密图像应该与原始图像视觉上几乎无法区分PSNR值会非常高通常30dB甚至40dB。4.3 安全性初步测试密钥敏感性分析一个安全的加密系统应对密钥极其敏感。我们通过微调某个密钥参数观察解密结果是否迅速恶化。% 测试密钥seed2的敏感性错误密钥解密 wrong_seed2 seed2 1; % 仅将seed2加1 decrypted_wrong double_random_phase_decrypt(cipher_complex, lambda, z1, z2, dx, dy, seed1, wrong_seed2); figure; subplot(1,2,1); imshow(decrypted_img, []); title(使用正确密钥解密); subplot(1,2,2); imshow(decrypted_wrong, []); title([使用错误密钥(seed2, num2str(wrong_seed2), )解密]); % 测试衍射距离z1的敏感性 wrong_z1 z1 * 1.001; % z1有0.1%的误差 decrypted_wrong_z double_random_phase_decrypt(cipher_complex, lambda, wrong_z1, z2, dx, dy, seed1, seed2); figure; imshow(decrypted_wrong_z, []); title([z1存在0.1%误差的解密结果]);结果分析当seed2即使只有1的偏差时解密图像应恢复为类似噪声的图案完全看不到原始内容。当传播距离z1有微小误差如0.1%时解密图像也会变得模糊不清无法辨认。这证明了菲涅尔变换距离参数作为密钥的有效性。5. 进阶讨论与性能优化实现基础功能后我们可以从工程和学术角度进一步思考如何优化和评估这个系统。5.1 如何评估加密系统的性能除了直观的视觉比较和PSNR我们还需要一些更专业的指标直方图分析加密后的图像其像素值直方图应接近均匀分布与原始图像具有明显统计特征的直方图形成对比。这表明加密算法能有效破坏图像的统计特性。figure; subplot(2,2,1); imhist(plain_img); title(明文直方图); subplot(2,2,2); imhist(cipher_amp); title(密文直方图); subplot(2,2,3); imshow(plain_img); title(明文); subplot(2,2,4); imshow(cipher_amp, []); title(密文);相邻像素相关性自然图像中相邻像素水平、垂直、对角线通常具有很高的相关性。好的加密算法应能极大降低这种相关性。可以计算相关系数来量化function corr_coef adjacent_correlation(img, direction) % direction: horizontal, vertical, diagonal [M, N] size(img); img double(img(:)); % 展平 switch direction case horizontal x img(1:end-1); y img(2:end); case vertical x img(1:end-N); y img(N1:end); case diagonal x img(1:end-N-1); y img(N2:end); end corr_coef corrcoef(x, y); corr_coef corr_coef(1,2); end % 计算并对比 corr_plain_h adjacent_correlation(plain_img, horizontal); corr_cipher_h adjacent_correlation(cipher_amp, horizontal); fprintf(明文水平相邻像素相关系数: %.4f\n, corr_plain_h); fprintf(密文水平相邻像素相关系数: %.4f\n, corr_cipher_h);预期密文的相关系数应接近0而明文的相关系数接近0.9以上。信息熵图像的信息熵反映了其信息的不确定性。加密后图像的信息熵应接近其最大值对于8位图像最大熵为8。entropy_plain entropy(plain_img); entropy_cipher entropy(cipher_amp/max(cipher_amp(:))); % 归一化到[0,1]计算 fprintf(明文图像熵: %.4f\n, entropy_plain); fprintf(密文图像熵: %.4f\n, entropy_cipher);5.2 计算效率优化技巧菲涅尔变换角谱法涉及两次FFT是计算中最耗时的部分。对于大图像或实时性要求高的场景可以考虑预计算传递函数如果lambda,z,dx,dy和图像尺寸固定菲涅尔变换的传递函数H可以预先计算并存储加密解密时直接调用避免重复计算。% 预计算H [M, N] size(plain_img); fx (-N/2 : N/2-1) / (N * dx); fy (-M/2 : M/2-1) / (M * dy); [FX, FY] meshgrid(fx, fy); H1 exp(1i * 2 * pi * z1 / lambda .* sqrt(1 - (lambda*FX).^2 - (lambda*FY).^2)); H1(imag(H1) ~ 0) 0; H2 exp(1i * 2 * pi * z2 / lambda .* sqrt(1 - (lambda*FX).^2 - (lambda*FY).^2)); H2(imag(H2) ~ 0) 0; % 在fresnel_transform函数中直接使用传入的预计算H使用GPU加速Matlab支持使用gpuArray将数据放到GPU上计算。FFT在GPU上并行效率极高。plain_img_gpu gpuArray(plain_img); RP1_gpu gpuArray(RP1); % ... 后续计算都在GPU上进行 cipher_amp_gpu gather(cipher_amp_gpu); % 计算完传回CPU注意需要确保电脑有支持CUDA的NVIDIA GPU和Parallel Computing Toolbox。采用快速卷积近似在满足一定条件下如傍轴近似成立菲涅尔变换可以表示为卷积形式进而利用FFT加速。角谱法本身已是基于FFT的快速算法。5.3 系统的潜在弱点与改进思路没有任何加密系统是完美的。了解其潜在弱点有助于我们正确使用或改进它选择明文攻击如果攻击者能够选择特定的明文图像并获取对应的密文他可能通过大量分析来推断出相位板的部分信息。增加非线性操作如引入像素置乱、扩散操作可以增强抵抗此类攻击的能力。已知相位板攻击如果相位板的生成算法和种子已知但衍射距离未知攻击者可能通过暴力搜索距离参数来破解。因此z1,z2,lambda,dx,dy这些参数都应作为密钥的一部分妥善保管并且其取值范围应足够大使暴力搜索不可行。唯密文攻击对于仅能获取密文的攻击者双随机相位结合菲涅尔变换的系统目前被认为是足够安全的尤其是当密文仅为幅度信息时相位恢复本身就是一个难题。对噪声的鲁棒性在实际的光学系统中噪声是不可避免的。可以在仿真中加入高斯噪声、散斑噪声等测试解密算法对噪声的容忍度。可以考虑在加密前对图像进行预处理或结合纠错编码技术。一个常见的改进思路是引入像素级扩散机制。例如在第一次相位调制前先对图像进行Arnold猫脸变换或Logistic混沌映射进行置乱破坏图像的局部相关性。在第二次相位调制后再进行一次基于混沌序列的像素值扩散。这样可以将一点明文信息的改变扩散到整个密文图像符合香农的扩散与混淆原则。6. 常见问题与调试记录在实际编写和运行代码时你可能会遇到以下问题。这里记录了我的排查过程和解决方法。问题1解密图像一片漆黑或全是噪声PSNR极低。可能原因A相位板种子不一致。这是最常见的原因。确保加密和解密函数调用时seed1和seed2参数完全一致。一个调试技巧是在加密函数内部生成相位板后立即保存为.mat文件在解密函数开始时加载这个文件来使用相位板确保一致性。可能原因B菲涅尔变换参数不一致。检查lambda,z1,z2,dx,dy这些参数在加解密过程中是否一个字母不差。特别是z1和z2的正负号在逆变换时是否正确处理使用-z。可能原因C复数运算或FFT移位错误。仔细检查fresnel_transform函数中的fftshift和ifftshift的使用顺序。角谱法的标准流程是fftshift(fft2(ifftshift(input)))和fftshift(ifft2(ifftshift(频谱)))。顺序错误会导致结果完全不对。排查步骤首先做一个最简单的测试不进行菲涅尔变换只做两次随机相位调制和解调。如果这样能完美恢复图像说明相位板生成和管理没问题问题出在菲涅尔变换环节。将菲涅尔变换的距离z设为0此时变换应为恒等变换。测试加解密是否能恢复图像。逐步增加z的值观察解密图像质量如何随z变化。如果仅在某个z值下能解密说明你的菲涅尔变换函数可能是正确的如果任何z都不行则函数实现有误。问题2解密图像边缘有亮斑或周期性条纹。可能原因频谱混叠。这通常是因为采样间隔dx,dy设置过大或者传播距离z过大导致角谱传递函数H中的最高空间频率超过了奈奎斯特频率。解决方法减小dx,dy即提高采样率。减小传播距离z。在计算H时更严格地处理倏逝波。可以尝试使用H exp(1i * pi * lambda * z * (FX.^2 FY.^2))这个傍轴近似公式它在很多情况下能避免虚数问题但需注意其适用条件z远大于图像尺寸。问题3加密后的密文图像看起来不是均匀噪声反而有某些结构。可能原因A原始图像动态范围太大或存在异常值。确保输入图像是double类型且归一化到[0, 1]区间。对于某些高对比度图像可以先进行一个温和的对比度拉伸或直方图均衡化。可能原因B随机相位板生成有问题。检查generate_random_phase_mask函数确保rand函数生成的是均匀分布并且exp(1i*2*pi*rand())能覆盖整个单位圆。验证方法单独显示第一块随机相位板RP1的相位角分布图angle(RP1)它应该是一个在[-π, π]之间完全随机、无任何结构的图像。问题4程序运行速度很慢尤其是对大图像。原因FFT运算是O(N^2 log N)复杂度图像越大越慢。两次菲涅尔变换意味着四次FFT加密解密各两次。优化如前所述预计算传递函数H。使用fft2和ifft2的优化版本Matlab默认已优化。考虑使用GPU加速。如果只是原理验证可以先将图像下采样到较小尺寸如256x256进行快速测试。问题5我想加密彩色图像怎么办方法将彩色图像RGB分解为R、G、B三个通道对每个通道单独进行上述加密过程。需要注意的是三个通道可以使用相同的随机相位板和衍射距离也可以使用不同的密钥以增强安全性。加密后得到三幅密文可以合并显示但可能看起来还是灰度噪声。解密时分别对三个通道解密后再合并。最后分享一点个人在复现这类光学算法时的体会耐心比对每一步的中间结果至关重要。尤其是复数域的操作肉眼难以直接观察。我习惯在开发时将每一步的复振幅的幅度和相位分别显示出来并与理论预期进行对比。例如经过第一次随机相位调制后图像的幅度应保持不变因为相位板模为1但相位图应变成随机噪声。通过这种细致的检查能快速定位问题所在。这个基于双随机相位和菲涅尔变换的无透镜加密框架其魅力在于将深刻的光学原理转化为简洁优雅的数学运算和代码。它不仅是图像加密的一个有效方案更是理解波前调控、衍射计算和相位恢复等光学信息处理概念的绝佳范例。