ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

傅立叶变换与相位掩膜:双随机相位编码图像加密原理及Matlab实现

傅立叶变换与相位掩膜:双随机相位编码图像加密原理及Matlab实现 我最早接触相位掩膜加密是在做光学信息处理课题的时候。当时看到双随机相位编码那篇经典文献第一反应是这玩意儿真的能加密吗——加密完的图像打印出来一看还是带着原始图像的轮廓感觉跟没加密一样。后来才明白那个看起来像原图的东西只是密文的振幅分布真正藏着信息的是相位。也就是从那一刻起我对傅立叶变换相位掩膜这套图像加密路子的看法完全变了。今天这篇文章就把我从原理到Matlab实现、再到踩坑教训的完整过程梳理一遍给同样在研究图像加密算法的朋友做个参考。为什么是傅立叶变换加相位掩膜从经典双随机相位编码说起1.1 相位比振幅更适合当密钥先说一个很多人刚接触时都会困惑的问题图像加密的方法那么多置乱、混沌、DNA编码、压缩感知为什么光学领域偏偏爱用傅立叶变换加相位掩膜关键在于相位掩膜本身的性质。相位掩膜本质上是一块能改变光波相位的透明薄片它对光的振幅几乎不做衰减。加密的时候我们把图像信息乘上一个随机相位分布相当于给原始信息的每个像素点都乘了一个模长为1的复数。这个操作看起来只是改变了相位但实际上它把图像的频谱结构彻底打散了。为什么说相位比振幅更适合做密钥因为振幅信息是人眼可以直接感知的一旦密文是振幅型的攻击者还能从强度分布里看出一些统计特征。而相位信息肉眼不可见只能借助干涉、全息或者数字计算才能恢复。更重要的是随机相位掩膜的空间变化频率非常高每个像素的相位值都是独立的随机量这使得密文在空域和频域上都表现得像噪声。你就算把密文打印出来或者存成图片攻击者看到的也只是一片颗粒状噪声完全拿不到有效信息。做这个对比可能更直观如果只用振幅掩膜也就是乘一个随机的实数衰减因子加密后的图像虽然变乱了但像素值的动态范围、统计直方图等特征仍然和分析者手中的已知明文有对应关系。而相位掩膜乘上去之后图像的能量谱被重新分配密文几乎不携带原始图像的统计特征。这也是为什么后来几乎所有光学加密方案——不管是用菲涅耳变换、分数傅立叶变换还是联合变换相关器——都把相位掩膜作为核心安全元素的根本原因。1.2 傅立叶域是天然的加密工作台再来说傅立叶变换。经典的图像处理里傅立叶变换主要用来做频谱分析、滤波、压缩但到了光学加密这里傅立叶变换本身就是加密过程的一部分。原因其实很朴素。数字图像傅立叶变换之后得到的是复数矩阵这个矩阵的实部、虚部、幅值、相位各自都能携带信息加密空间天然就比空域大。而且傅立叶变换在空域和频域之间建立了严格的数学对应关系加密时每做一次正变换信息就从一种域跳到了另一种域配合相位掩膜使用可以形成多轮变换-掩膜-变换的循环结构。每一轮循环都在显著改变密文的统计分布这就让暴力破解的复杂度成倍上升。更重要的是傅立叶变换有快速算法FFT在Matlab里就是一行fft2的事。这对于做算法验证来说极其友好——你可以把心思放在加密逻辑和安全性分析上而不是花大把时间处理离散傅立叶变换的数值实现细节。我做课题那会儿最庆幸的也是这点Matlab里从加密到解密、再到各种攻击实验整个流程写下来也就一百多行代码迭代速度非常快。1.3 经典DRPE方案的加密架构标题里提到的相位掩膜在学术文献里最常对应的就是双随机相位编码Double Random Phase Encoding简称DRPE。这个方案是1995年由Refregier和Javidi提出的思路可以用一句话概括在输入平面放一个随机相位掩膜在频谱平面再放一个随机相位掩膜光路走完两次傅立叶变换输出就变成了统计特性近似白噪声的复值密文。加密过程我习惯用四个步骤来记原始图像乘上第一个随机相位掩膜完成空域随机化对上一步结果做一次傅立叶变换把信号搬移到频域频域结果乘上第二个随机相位掩膜完成频域随机化再做一次傅立叶变换得到密文。解密过程则是完全相反的操作密文先做逆傅立叶变换乘上第二个相位掩膜的复共轭再做逆傅立叶变换最后乘上第一个相位掩膜的复共轭就能恢复原始图像。整个过程里两个相位掩膜就是密钥。没有密钥密文在解密光路上只会得到一堆噪声。这个架构最漂亮的地方在于它的对称性和简洁性——加密和解密用完全相同的光路只是相位掩膜换成了共轭版本。这种设计在实际光学系统中意义重大因为光路不需要重新搭建只要更换相位掩膜就能完成解密。到了数字实现上这个对称性同样让代码变得非常清晰之后我会在代码部分详细展开。DRPE也不是没有代价。它默认了光学系统是线性移不变的实际中如果存在像差、对准误差、或者相位掩膜的量化误差解密质量就会明显下降。所以很多后续研究都在DRPE基础上加了分数阶参数、非对称密钥、甚至混沌密钥让系统对误差更鲁棒。但不管怎么改进核心原理还是这一套——傅立叶变换负责搬运信息相位掩膜负责打散信息。加密与解密的数学推导从公式到Matlab代码的逐行对照2.1 连续域上的数学表达在写代码之前我建议先把数学模型理一遍。因为Matlab代码虽然只有几行但如果公式和代码对不上出了问题排错会很痛苦。记原始图像为\(f(x,y)\)两个随机相位掩膜分别为\(p_1(x,y)\exp[j\phi_1(x,y)]\)和\(p_2(u,v)\exp[j\phi_2(u,v)]\)其中\(\phi_1\)和\(\phi_2\)是在\([0,2\pi]\)上均匀分布的随机相位。这里的\((x,y)\)表示空域坐标\((u,v)\)表示频域坐标。加密过程用公式写是这样的第一步空域调制\[ g_1(x,y) f(x,y) \cdot p_1(x,y) \]这个乘法对应代码里的f .* exp(1i * phi1)。第二步傅立叶变换\[ G_1(u,v) \mathcal{FT}[g_1(x,y)] \]在Matlab里是fftshift(fft2(g1))。注意fftshift的作用是把零频搬移到矩阵中心虽然不做这步也能解密但做了之后相位掩膜的空间分布和光学实验对应得更直观。第三步频域掩膜调制\[ G_2(u,v) G_1(u,v) \cdot p_2(u,v) \]代码对应G2 G1 .* exp(1i * phi2)。第四步第二次傅立叶变换得到密文\[ \psi(x,y) \mathcal{FT}[G_2(u,v)] \]到这里密文是复值分布实部和虚部都有意义。需要说明的是最后这一步在有些文献里用逆傅立叶变换有些用正傅立叶变换两种写法都是自洽的因为只要解密时对应地取逆操作即可。解密过程第一步对密文做逆傅立叶变换\[ G_2(u,v) \mathcal{FT}^{-1}[\psi(x,y)] \]第二步乘上第二个相位掩膜的共轭\[ G_1(u,v) G_2(u,v) \cdot p_2^*(u,v) \]第三步做逆傅立叶变换\[ g_1(x,y) \mathcal{FT}^{-1}[G_1(u,v)] \]第四步乘上第一个相位掩膜的共轭\[ f(x,y) g_1(x,y) \cdot p_1^*(x,y) \]如果\(p_1\)和\(p_2\)的相位都取正确理论上\(f\)会精确恢复出\(f\)。真实实现里因为有浮点误差恢复图像和原始图像会有极微小的差别但肉眼完全看不出来相关系数一般在0.9999以上。2.2 Matlab核心代码实现理论部分说完直接上代码。我用的是最标准的DRPE实现总共三个函数密钥生成、加密、解密。为了保证复现性我把随机种子也写进去了。% % 函数1生成随机相位掩膜 % 输入imgSize - 图像尺寸方阵用标量矩形用1x2向量 % 输出phaseMask - 随机相位掩膜范围[0, 2*pi) % function phaseMask generatePhaseMask(imgSize) % 生成[0,1)均匀分布的随机矩阵再映射到[0, 2*pi) randomPhase rand(imgSize) * 2 * pi; phaseMask exp(1i * randomPhase); end这里有个隐藏细节。rand生成的是[0,1)区间的均匀分布乘以2*pi后得到[0,2π)的均匀相位分布。为什么一定要均匀分布因为相位均匀分布可以保证密文在统计上接近白噪声攻击者无法从相位分布中提取有效特征。如果相位只在局部范围变化加密强度会大打折扣。接着是加密函数% % 函数2DRPE加密 % 输入 % img - 灰度图像uint8或double均可 % phi1 - 空间域随机相位矩阵与img同尺寸 % phi2 - 频域随机相位矩阵与img同尺寸 % 输出 % ciphertext - 复值密文 % function ciphertext drpeEncrypt(img, phi1, phi2) % 统一转换为double避免uint8运算溢出 img double(img); % 第一步空域调制 g1 img .* exp(1i * phi1); % 第二步傅立叶正变换并移至中心 G1 fftshift(fft2(g1)); % 第三步频域调制 G2 G1 .* exp(1i * phi2); % 第四步第二次傅立叶正变换得到密文 ciphertext fft2(G2); end解密函数% % 函数3DRPE解密 % 输入 % ciphertext - 复值密文 % phi1 - 空间域随机相位加密时使用的 % phi2 - 频域随机相位加密时使用的 % 输出 % decrypted - 解密后的图像double类型 % function decrypted drpeDecrypt(ciphertext, phi1, phi2) % 第一步对密文做逆傅立叶变换 G2_hat ifft2(ciphertext); % 第二步频域去掩膜 G1_hat G2_hat .* exp(-1i * phi2); % 第三步逆傅立叶变换回到空域 g1_hat ifft2(ifftshift(G1_hat)); % 第四步空域去掩膜 decrypted g1_hat .* exp(-1i * phi1); % 提取实部理论结果应为实数并裁剪到有效范围 decrypted real(decrypted); decrypted max(0, min(255, decrypted)); end主脚本调用示例% 主程序示例 clear; clc; close all; % 读取并预处理图像 img imread(cameraman.tif); img double(img); % 生成密钥两个随机相位掩膜 phi1 2 * pi * rand(size(img)); phi2 2 * pi * rand(size(img)); % 加密 ciphertext drpeEncrypt(img, phi1, phi2); % 解密 decrypted drpeDecrypt(ciphertext, phi1, phi2); % 显示结果 figure; subplot(1,3,1); imshow(uint8(img)); title(原始图像); subplot(1,3,2); imshow(abs(ciphertext), []); title(密文振幅); subplot(1,3,3); imshow(uint8(decrypted)); title(解密图像); % 评估质量 corr corr2(img, decrypted); fprintf(解密图像与原始图像的相关系数%f\n, corr);这段代码在MATLAB R2018b之后都可以直接运行。跑出来的结果大家会看到密文振幅图确实还隐约带着原始图像轮廓。关于这一点我多说一句——振幅是复数密文的模它只保留了强度信息丢失了相位信息所以解密光路里其实还需要原始相位分布。反过来这也意味着只用振幅图做攻击是拿不回原始图像的真正敏感的密钥信息在相位里。2.3 为什么解密端要乘共轭而不是除掩膜这里有个很多初学者会问的问题解密的时候为什么是用exp(-1i * phi2)乘上去而不是直接除以exp(1i * phi2)数学上两者等价但数值稳定性差别很大。因为exp(1i * phi2)是模长为1的纯相位因子它的倒数就是它的共轭。用共轭乘法去实现除法计算机只需要做一次复数乘法如果直接写除法浮点运算中要考虑除数不能为0而且运算速度更慢。更重要的是在光学实现里共轭相位掩膜可以通过全息手段物理制作而除以相位在光学上是不可实现的。所以解密端乘共轭既是数字上的最优解也是光学上的唯一解。MatlaB实现中的四个关键细节复数图像、相位生成、能量归一化与显示陷阱3.1 复数图像的处理逻辑Matlab里复数矩阵可以直接参与运算这给DRPE实验带来了巨大的便利。但便利归便利有几个和复数相关的细节一定要处理妥当。第一加密过程中间产生的所有矩阵都是复数矩阵。包含两个部分——实部和虚部。在任何一步如果误用了imshow直接显示复数矩阵Matlab会只显示实部你看到的会是一团没有意义的灰。正确做法是要看密文的强度信息用abs()要看相位信息用angle()。第二复值密文如果要保存成文件不能直接存成BMP或PNG因为那些格式不支持复数。我常用的做法是分别保存实部和虚部或者保存为MAT文件。如果一定要存成图片方便传输可以把密文的实部和虚部分别映射到[0,255]转成uint8存档两个通道。解密的时候再读回来组合成复数矩阵。第三傅立叶变换的系数要统一。Matlab的fft2和ifft2自带归一化因子正变换不除任何系数逆变换自动除以总像素数两者互为逆运算。所以加密用fft2、解密用ifft2就能完美还原。关键是不能乱混——如果你加密时用了fft2解密第一步就必须用ifft2比如我的代码里就是这样的。万一加密和解密的变换方向颠倒了恢复出来的图像会发生旋转或者镜像一开始排查会觉得非常莫名其妙。3.2 相位掩膜的生成方式与安全性生成随机相位掩膜时rand函数产生的随机数在[0,1)上均匀分布。但要注意这个均匀分布是统计意义上的不同批次生成的相位掩膜相关性极低。为了实验的可重复性我建议在生成密钥时加固定种子rng(2024); % 固定随机种子便于复现 phi1 2 * pi * rand(size(img)); phi2 2 * pi * rand(size(img));不加种子的话每次运行代码都会生成新的密钥解密端如果用错密钥当然解不出来而且实验复现起来很麻烦。我自己做实验时就吃过这个亏——当时为了对比不同密钥的敏感性没记录种子回头想复现某组结果密钥已经找不回来了。另外相位掩膜的安全强度取决于相位量化级数。理论上相位是连续的每个像素的相位值有无穷多种可能。实际数字实现里相位最终以浮点数存储每个像素的有效信息量大约是52比特双精度浮点的尾数位。对一张256×256的图像来说密钥空间大约有\(256 \times 256 \times 52\)比特这个量级的暴力破解在现实中是不可能的。但这里有个反直觉的点相位掩膜也不是越随机越好。如果相位分布太均匀随机在数字实现里固然安全但在光学实现里相位掩膜的加工精度有限太高频的相位变化制作不出来解密时会产生严重的噪声。所以实际工程中相位掩膜通常要做平滑处理或者限制最小特征尺寸。纯数字实验虽然不存在加工问题但如果你后续要做光学验证从算法设计阶段就应当考虑这个约束。3.3 能量归一化的细节加密后的密文能量和原始图像的能量是守恒的因为傅立叶变换是酉变换相位掩膜只改变相位不改变模长。理论上密文的能量应该和原图一致但浮点运算会把能量放大很多尤其在显示和保存密文时需要考虑。我做实验时发现直接imshow(abs(ciphertext))出来的图常常是白茫茫一片边缘根本看不见细节。原因很简单密文中某些像素的幅度特别大导致线性映射到显示范围时其他像素都被压缩到接近白色。这时候用imshow(abs(ciphertext), [])让Matlab自动按最小值和最大值映射显示范围效果会好很多。我在前面代码里就是这么写的。如果要做定量的能量分析可以在加密后加一行energy_original sum(img(:).^2); energy_cipher sum(abs(ciphertext(:)).^2); fprintf(原始能量%f密文能量%f比值%f\n, ... energy_original, energy_cipher, energy_cipher/energy_original);理论上这个比值应该接近1。如果比值偏离很大不是代码逻辑出错就是要检查是不是中间某一步误用了uint8导致数据截断。3.4 密文显示方向与imshow的坑最后再说一个我踩过的坑。单个fft2的零频在矩阵的四个角上所以fft2的结果如果不做fftshift频谱中心在四个角显示出来就是四个亮斑很不好看。我在加密函数里加了fftshift处理让频谱中心落在矩阵中央。但解密的时候要对称地处理既然加密端对fft2的结果做了fftshift那解密端在逆变换之前就必须做ifftshift。我的解密代码里就是这么写的——ifft2(ifftshift(G1_hat))。如果加密做了fftshift而解密漏了ifftshift恢复图像会发生整体平移看起来像是对不齐的重影。这个问题非常隐蔽因为结果不是完全错误只是图像位置偏了容易让人误以为是代码其他地方的参数有问题。密钥敏感性实验用相关系数曲线看加密系统的真实安全性4.1 密钥错误解密的直观效果很多论文在验证方案安全性时会放一张错误密钥解密结果的图内容通常是一团噪声。我建议所有做这个方向的朋友都亲手跑一遍这个实验因为只有亲眼看对比才能真正理解密钥敏感性的含义。实验设计非常简单加密时使用正确的phi1和phi2解密时故意把phi2做一点微小的扰动比如在某个像素上增加\(10^{-6}\)弧度的偏差然后观察解密图像。你会看到什么结果会非常夸张——哪怕只扰动了一个像素的相位值解密出来的图像都可能完全面目全非。原因在于解密过程本质上是傅立叶域的相位匹配过程任何一个像素的相位不匹配都会通过逆傅立叶变换扩散到整个空域造成全局性的噪声污染。这就像一把钥匙上有任何一个小齿不对整个锁就打不开。具体的实验代码可以这样写% 篡改一个像素的相位 phi2_attack phi2; phi2_attack(100, 100) phi2_attack(100, 100) 1e-6; % 用错误密钥解密 decrypted_wrong drpeDecrypt(ciphertext, phi1, phi2_attack); % 比较 corr_wrong corr2(img, decrypted_wrong);当phi2只有单像素微扰时相关系数直接掉到0.01以下。这就是DRPE方案密钥敏感性的威力。4.2 密钥偏差的量化曲线更系统的做法是画一条相关系数随密钥偏差变化的曲线。比如把整个phi2矩阵加上一个固定偏移量\(\Delta\)偏移量从\(10^{-8}\)逐渐增大到\(10^{-1}\)观察解密图像和原始图像的相关系数如何变化。我做过这条曲线趋势大致是这样的\(\Delta\)在\(10^{-8}\)量级时解密质量几乎无损相关系数0.999\(\Delta\)在\(10^{-6}\)量级时相关系数开始出现轻微下降约0.95左右\(\Delta\)到达\(10^{-4}\)量级时相关系数降到0.5以下图像已不可辨认\(\Delta\)超过\(10^{-2}\)时相关系数趋近于0完全解密失败。这个曲线的陡峭程度直观反映了系统的密钥敏感性。DRPE曲线的下降斜率极大说明它对密钥精度的要求极为苛刻。这个特性一方面保证了安全性——攻击者就算逼近了正确密钥只要差一点点就解不出来另一方面也带来麻烦——如果相位掩膜在传输或存储过程中发生轻微变形合法用户也会解密失败。所以实际应用里往往需要在解密端加一些容差算法或者数字后处理比如迭代相位恢复才能提高鲁棒性。4.3 密钥空间与防暴力破解的数学依据密钥空间的估算方法值得单独说。假设相位掩膜尺寸为\(M \times N\)像素每个像素的相位在\([0, 2\pi)\)上连续取值。数字实现中每个相位值用双精度浮点数存储有效随机位数约52比特。那么理论密钥空间约为\(2^{52MN}\)。这个数字有多大做个对比AES-256的密钥空间是\(2^{256}\)而即使是64×64的超小图像DRPE的密钥空间也有\(2^{52\times64\times64}\)远远超过AES。当然实际安全性不能只算密钥空间还要考虑有没有数学攻击手段可以绕过暴力搜索。DRPE作为线性系统确实存在已知明文攻击和选择明文攻击的隐患这部分我在后文会专门展开。但只从暴力破解角度讲DRPE的密钥设计是有充分安全裕度的。加噪与裁剪鲁棒性测试评估加密方案的实际可用性5.1 噪声攻击模拟高斯噪声与椒盐噪声加密算法的安全性当然重要但如果密文稍微受点干扰就完全解不出来这个方案也没有实用价值。实际传输过程中密文可能经过有损信道比如加了信道噪声、被压缩、或者被裁剪了一部分。所以鲁棒性测试是评估方案实用性的硬指标。我的测试方案很简单。对密文添加不同强度的高斯噪声然后解密观察解密图像质量。相关代码noise_levels [0.01, 0.05, 0.1, 0.2]; for k 1:length(noise_levels) noise noise_levels(k) * randn(size(ciphertext)); ciphertext_noisy ciphertext noise; decrypted_noisy drpeDecrypt(ciphertext_noisy, phi1, phi2); corr_noisy(k) corr2(img, decrypted_noisy); % 也可以再加椒盐噪声测试 ciphertext_salt imnoise(real(ciphertext), salt pepper, 0.05); ciphertext_complex ciphertext_salt 1i * imag(ciphertext); decrypted_salt drpeDecrypt(ciphertext_complex, phi1, phi2); corr_salt(k) corr2(img, decrypted_salt); end从实验结果看DRPE对加性高斯噪声有中等抗性。噪声强度在0.05以下时解密图像虽然变模糊了但主要结构仍然保留噪声强度超过0.1之后图像基本只能看出个大概轮廓到了0.2就明显无法辨认了。如果你是纯数字实验这个表现够用。但如果是实际光学系统的捕获噪声、探测器热噪声叠加往往比单纯高斯噪声复杂得多。所以做鲁棒性分析时我建议至少测试两种噪声模型用多条曲线综合评估。5.2 裁剪攻击密文缺一块还能解出来吗裁剪攻击是另一种常见的鲁棒性测试。密文传输中如果被截断、遮挡部分信息丢失解密还能不能恢复原始图像这个问题的答案和直觉完全相反DRPE的密文裁剪一小块解密图像的质量下降得非常厉害。我做了一个实验分别裁剪密文中心的5%、10%、20%区域然后置零解密后发现裁剪5%解密图像有明显条纹噪声结构可辨但质量显著下降裁剪10%图像细节大量丢失边缘重影明显裁剪20%基本只剩模糊轮廓已无法有效恢复。这个现象的数学解释很清晰。密文是原始图像经过两次傅立叶变换加两次相位调制得到的中间信息的能量几乎均匀分布在密文的每个像素上。裁剪掉密文的一部分丢失的不是图像局部信息而是全局能量的相应比例。傅立叶变换的全局性在这里既是优点也是缺点——优点是对单点噪声不敏感因为噪声能量会被扩散到全局缺点是对局部缺失敏感因为缺失信息也扩散到全局。相比之下空域置乱类加密方案对裁剪攻击的抗性要差得多——裁掉一块那块对应的原始图像信息就彻底丢失。DRPE在裁剪鲁棒性上反而更好一点因为信息是全局分布的你至少还能恢复出一个模糊版本。没有哪种方案是完美的关键看你的应用场景更看重哪方面。5.3 鲁棒性结果对实际应用的启示做完这几轮攻击实验我对DRPE的定位更清楚了。它适合的场景是密文在受控信道中传输比如光纤链路、存储介质信道质量有基本保障密钥分发通过离线方式或安全信道完成。如果密文要在公共互联网上传输建议压缩编码时增加纠错层或者在密文中嵌入冗余校验信息。反过来如果有人声称自己的光学加密方案既能防暴力破解又能抗所有信道干扰那大概率是把安全性和鲁棒性混为一谈了。这两个指标本质上存在矛盾——安全性要求密钥微小偏差就能导致解密完全失败鲁棒性则要求信道干扰不导致解密失败。现实中只能取平衡通常做法是牺牲一点极端安全性去换取抗噪能力比如用分数阶傅立叶变换代替标准傅立叶变换通过分数阶参数提供额外自由度在安全性和鲁棒性之间找到更灵活的折中点。这个经典方案的边界与进阶方向从线性系统攻击到混沌密钥6.1 已知明文攻击的隐患经典的DRPE方案有一个著名的理论弱点——它是线性系统。攻击者如果获取了一对明文-密文样本可以通过求解线性方程反推出等效密钥这就是已知明文攻击。具体来说DRPE加密过程可以看成一系列线性操作乘相位掩膜、傅立叶变换的复合虽然单个相位掩膜是密钥但组合起来的变换是可推断的。当然这并不意味着DRPE一文不值。实际破解中攻击者需要精确知道密文的复数分布振幅和相位都完整同时还要有足够的计算资源和数值精度。由于光学密文的相位信息很难直接探测现实中完整获取复值密文本身就困难。不过做研究的人心里得有数基础DRPE的理论安全性上限是存在的不是万能的。6.2 常用的安全增强手段既然基础DRPE有线性弱点主流的改进思路就从加入非线性入手。常用的办法有这么几条在DRPE结构中引入分数阶傅立叶变换FRFT加密过程变为多次不同阶次的变换阶次本身也成了密钥。Matlab里FRFT没有内置函数可以用快速实现算法比如Ozaktas的三重快速傅立叶变换法。额外阶次参数能显著增强安全性即使相位掩膜泄露攻击者还要面对未知的变换阶次。把随机相位掩膜替换为混沌序列生成的伪随机相位比如基于Logistic映射或Lorenz系统的混沌序列。这样做的好处是密钥从一整块随机相位图变成几个混沌系统参数密钥管理与传输的成本大大降低。混沌系统本身对初始条件极其敏感这天然契合加密的需求。在空域和频域之外再增加一级变换比如小波变换。图像先做多级小波分解选择部分子带作DRPE加密其余子带做其他处理。这样既压缩了数据量又提高了破解难度。优先保留振幅信息只对相位做置乱和编码。实值密文在传输和显示上更方便近年来很多研究走这个方向。6.3 实际做研究时应该注意什么最后分享几条实操层面的建议。第一相位密钥一定要独立备份。做实验时密钥就是你的命根子丢了密钥等于数据全毁。我习惯的做法是把密钥矩阵保存到独立的.mat文件里文件名带序号和日期方便回溯。第二写代码时加密函数和解密函数最好封装成独立的函数文件不要揉在一个脚本里。DRPE的加密和解密结构很像如果混在一起调试时很容易改错一处影响全局。我在前文给出的三个函数是经过整理的版本可以直接参考。第三结果评估不要只看相关系数建议同时输出PSNR。相关系数对整体灰度变化不敏感即使图像整体偏暗相关系数也可能很高。而PSNR能反映像素级的误差大小。两个指标配合使用评价才全面。计算PSNR的代码很简单mse_val mean((img(:) - decrypted(:)).^2); psnr_val 10 * log10(255^2 / mse_val); fprintf(PSNR%f dB\n, psnr_val);第四如果打算往实时光学加密方向发展建议尽早用光学仿真工具如VirtualLab或Zemax建立光路模型结合衍射传播、透镜像差等因素做仿真。纯数字实验的光路是理想的实际光学系统中相位掩膜是物理器件存在对准误差、量化误差、色差这些都会让解密质量打折。我的经验是数字实验能到相关系数0.9999实际光学系统能做到0.9就很不错了。从我的个人体验来说傅立叶变换配合相位掩膜的这套加密思路最大的价值在于它把抽象的信息安全问题和直观的光学物理过程完美对应。你可以在Matlab里灵活调整参数、快速验证想法又能把结果推到光学平台上做真实光路实验这种数字-光学双轨验证的路径是很多其他加密方案不具备的。如果你正在做图像加密方向的研究或者课程设计从DRPE起步把原理吃透、代码跑通、实验做完再往分数域、混沌密钥这些方向延伸会是性价比非常高的一条路线。
返回列表