资讯动态

压缩感知与图像加密混合算法:密钥控制测量矩阵的原理与Matlab实现

发布时间:2026/10/20 5:42:11 来源:尧图企业网站定制
很多人第一次看到“基于压缩感知的压缩加密混合算法”这个标题时心里大概都会冒出同一个问题压缩感知本身不就是在压缩图像吗加密再单独做一层不就行了为什么非要扯到一起我一开始也是这个想法直到真的把代码跑起来、把两种流程放在一起对比之后才意识到把压缩和加密整合在同一个采样过程中省掉的不仅是计算量还有整个系统的冗余环节。这篇东西准备把这类混合算法的完整设计思路、密钥如何控制测量矩阵、Matlab代码怎么组织、实验指标怎么看、参数怎么调一次性聊透。不管你是正在做图像加密方向的研究生还是工作中需要处理图像传输安全和带宽压缩的工程师按着这篇文章的思路走至少能把一个可运行的Demo搭出来并且对背后的原理有清晰的把握。1. 为什么非要把压缩感知和加密捏在一起做1.1 单独压缩再单独加密的老方案到底哪里不划算传统图像传输流程一般是这样的先做像素域压缩比如JPEG或者JPEG2000得到压缩码流然后对这个码流做加密比如AES、DES之类接收端先解密、再解压。看起来每一步都很成熟但真正做系统的同学都知道这套流程有两个不太舒服的地方。第一个是冗余。压缩和加密被拆成两个独立模块图像数据要先被完整采集、完整存储然后才能压缩压缩完之后再加密。在大量的物联网传感节点、无线图像监控这类资源受限场景下前端处理单元往往没有能力同时扛住两套算法。第二个是效率问题。图像数据量大、相邻像素之间相关性极强直接用通用加密算法处理全图耗时和开销都不小。即便你只加密压缩后的码流码流的格式信息也有可能在加密前被分析出来泄露图像的结构特征。我见过不少做边缘端图像传输的项目最初都是压缩归压缩、加密归加密最后发现板子上的算力根本扛不住只能砍分辨率、砍帧率。后来换成压缩感知路线整个系统的负担反而降下来了。1.2 测量矩阵当加密载体这个想法凭什么成立压缩感知里面有个很基础的关系y Φx一个M维的测量向量y是从N维原始信号x里用测量矩阵Φ“压缩采样”得到的。这个Φ通常是M×N的随机矩阵而压缩感知理论的奇妙之处在于当信号本身在某个稀疏基下只有少数非零系数时即使M远小于N也能通过优化算法比较精确地恢复信号。关键点来了如果这个Φ是用密钥控制的——也就是说没有密钥就不知道Φ长什么样——那么测量过程本身就是一个加密过程。发端把y传出去窃听者手里只有一堆测量值却没有对应的测量矩阵他连方程y Φx都列不出来更别提求解了。收端只要知道密钥重新生成同样的Φ就能正常重构图像。这正是“密钥控制测量矩阵”的核心价值压缩和加密不是两步操作而是同一个线性投影过程。采集端只需要做一次随机投影既把数据量压下来了又把有效信息隐藏掉了。1.3 这个方向适合什么人能用在什么场景从我的实际经验来看这个方向适合的人群和场景至少有这么几类做图像保密传输的研究者尤其是需要兼顾带宽和安全性的人物联网节点或者嵌入式设备上的轻量级加密方案设计测量矩阵一旦固定前端只需要做矩阵乘法不需要跑复杂的加密轮函数云端的图像存储与密文检索场景因为测量值本身就是一种低维表示配合同态加密或者其他安全计算框架可以做不可见内容的检索和比对学生做课程设计或者毕业设计这类混合算法既有理论深度又有代码实现空间是很容易出成果的题目。当然它也不是没有代价。重构端的计算量比传统解码大通常需要迭代求解图像质量也依赖采样率的高低采样率低了恢复效果会明显下降。所以这不是“白拿”的好事而是在安全性、压缩率和重构质量之间做权衡。理解了这一点你再看后面的代码和实验数据就不会觉得某些结果是玄学了。2. 密钥控制测量矩阵的数学原理与设计2.1 从y Φx说起压缩感知的三个核心要素想把代码写对先得把模型在纸上写清楚。压缩感知的观测模型是y Φx ΦΨθ其中x是原始图像信号按列拉直成一维向量Ψ是稀疏基矩阵θ是x在Ψ下的稀疏系数向量。如果θ里只有K个明显非零的元素那么K就是信号的稀疏度。为了保证能从M个测量值里恢复出N个原始数据测量矩阵Φ必须满足一些约束条件其中最有名的是RIP性质和与稀疏基Ψ的不相干性。在实际工程里我们不需要天天把RIP挂在嘴边但有一条经验值得记住用高斯随机矩阵做测量矩阵和傅里叶基、DCT基、小波基之间的不相干性都比较好实测重构效果稳定。这也是为什么绝大多数压缩感知开源代码的第一版都拿randn生成Φ。但前面说了纯随机矩阵的问题是它不能用于加密——矩阵本身和密钥没有绑定关系任何人只要拿到同样的算法都能生成相同的矩阵。所以下一步就是把“随机性”从Matlab的随机数发生器转移到由密钥驱动的混沌系统上去。2.2 把密钥写进测量矩阵两种主流的构造路线把密钥和测量矩阵绑定常见做法有两条路。第一条路是用混沌序列直接构造测量矩阵。比如用Logistic映射生成一条混沌序列再把序列值按照某种规则排列成M×N的矩阵或者把序列的排序索引当作置乱表去置乱一个基础随机矩阵。因为混沌系统对初值和参数极端敏感只要密钥有一点点不同生成出来的矩阵就完全不同。这就是密钥敏感性的来源。第二条路是“固定基矩阵加密钥置乱”。先生成一个固定的随机基矩阵比如高斯矩阵然后用密钥驱动另一个混沌系统生成一组行索引和列索引对基矩阵做行置乱和列置乱。这种方法实现起来更简单而且基矩阵本身可以先离线生成在线只需要传递索引速度会快一些。我在实际项目中更倾向于先用混沌序列产生索引再对高斯矩阵做置乱。原因很简单纯混沌序列直接当矩阵用序列质量会受到混沌映射分布特性的影响矩阵元素的统计特性不一定理想而先有高斯矩阵的优良分布再进行置乱等于是保留了好矩阵的性质同时注入了密钥控制因素。后面代码部分我给出的就是这条路线。2.3 密钥空间与安全性分析这部分是要写进论文摘要或者开题报告里的内容所以稍微展开一下。Logistic映射的迭代公式是 x_{n1} μx_n(1-x_n)。当μ在(3.57, 4)区间时系统处于混沌状态。我们通常取μ和初值x0作为两个密钥因子。如果每个参数按双精度浮点数来算有效位数大约2^52仅这两个参数的组合就已经超过2^100远大于暴力穷举的可行范围。但要注意密钥空间大不等于方案安全。至少还要满足以下几条密钥稍有改变测量矩阵就显著改变导致解密彻底失败同一密钥生成的测量矩阵要稳定可复现不能受运行环境浮点误差影响导致收发端不一致密文测量值不能明显泄露明文信息比如形状轮廓、亮度分布等。第2条在实际实现里最容易翻车。Matlab在不同版本、不同操作系统下的浮点运算结果有时候会有极小差异如果这个差异最终导致测量矩阵不一致重构端出来的图像就会是满屏噪声。解决办法我后面会专门讲到核心思路就是“做量化校准”或者用整数域运算来生成索引。3. Matlab实现从密钥生成到图像重构的完整链路3.1 总体流程与模块划分整个算法的Matlab实现我建议按下面五个模块组织每个模块单独一个函数方便调试和替换模块函数作用输入输出密钥派生由密钥参数生成混沌序列和置乱索引密钥参数μ、x0、矩阵尺寸置乱索引、混沌序列测量矩阵生成生成由密钥控制的高斯测量矩阵置乱索引、M、NΦ矩阵图像分块与稀疏变换对图像分块后做DCT变换得到稀疏系数图像块、DCT基稀疏系数θ压缩加密端对稀疏系数做随机投影得到测量值并量化θ、Φ量化后的测量值解密重构端用密钥重建Φ、OMP恢复稀疏系数、逆变换回图像测量值、密钥参数重构图像块分块处理不是偷懒而是必须。一张512×512的图像拉直后N262144如果整图构造测量矩阵Φ就是M×26万的矩阵普通电脑的内存根本玩不转。所以实际实现基本都按8×8、16×16或者32×32分块处理。块越大稀疏性越好但计算量增长也快块太小DCT稀疏效果又变差。折中下来16×16是个比较舒服的尺寸。3.2 密钥控制测量矩阵的构造代码先看密钥派生和测量矩阵生成的代码。function [Phi, idxChaos] generatePhiByKey(mu, x0, M, N) % 用Logistic混沌序列产生置乱索引并用索引置乱高斯矩阵 len max(M * N, 4096); seq zeros(1, len); x x0; for k 1:len x mu * x * (1 - x); seq(k) x; end % 混沌序列排序得到置乱索引 [~, idxChaos] sort(seq); % 基础高斯随机矩阵 baseMat randn(M, N); % 行置乱、列置乱分别取混沌索引中的不同片段 rowPerm idxChaos(1:M); colPerm idxChaos(1:N); Phi baseMat(rowPerm, colPerm); % 归一化保持测量矩阵的性质 Phi Phi / sqrt(M); end这段代码有几个细节需要注意。第一混沌序列长度要至少等于矩阵元素总数实际我用的是max(M*N, 4096)宁可长一点也不要不够。第二排序索引用的是sort的第二个输出这一步在Matlab里很常见但有些同学会写成[seq_sorted, idx] sort(seq)容易把输入输出顺序搞反。第三归一化除以sqrt(M)是压缩感知测量矩阵的标准做法目的是让测量值的能量保持在合理范围不除以的话重构算法容易数值不稳定。密钥的可复现性是这里的灵魂。你在发端调用generatePhiByKey(3.9999, 0.3773, M, N)只要浮点环境一致得到的Φ和收端完全一样。而在实际工程中我强烈建议把μ和x0作为主密钥再配合一个用户ID一起派生具体做法是用主密钥和ID拼接成字符串再哈希成两个双精度数。这样即使多个用户共享同一套算法每个人的测量矩阵也是不同的。3.3 稀疏表示与OMP重构的代码细节图像块在DCT基下的稀疏系数求法很简单θ Ψ * x。这里Ψ’是DCT逆变换矩阵的转置对应正向DCT变换。Matlab里有现成的dctmtx函数一个N×N的正交矩阵直接用就行。压缩加密端的核心代码可以写成这样function [Yq, minVal, maxVal] compressEncryptBlock(x, Phi, Psi) % x: 图像块double类型长度N % Psi: DCT基 theta Psi * x; % 稀疏系数 y Phi * theta; % 压缩观测等价于 y Phi * Psi * x % 量化到[0, 255]区间 minVal min(y); maxVal max(y); if maxVal - minVal 1e-12 maxVal minVal 1e-12; end Yq round((y - minVal) / (maxVal - minVal) * 255); Yq uint8(Yq); end这里把y量化成uint8是为了让测量值能像普通图像一样存储和传输。要注意的是minVal和maxVal需要作为边信息随着密文一起发送否则收端无法反量化。这个量化和反量化过程单看公式很简单但实际传输中如果使用浮点数直接传输y数据量反而会比原图还大压缩率就无从谈起。所以量化一步不能省。重构端的核心是OMP算法。我在网上见过很多版本的OMP不少代码把支撑集更新写得花里胡哨但真正关键的就三件事找最大相关列、最小二乘更新系数、更新残差。下面这个版本我用着一直比较稳。function theta_hat OMP(y, A, K) % y: M维测量向量 % A: M*N感知矩阵A Phi * Psi % K: 稀疏度 [M, N] size(A); r y(:); selected []; theta_tmp []; for iter 1:K corr abs(A * r); [~, idx] max(corr); if ismember(idx, selected) break; end selected [selected, idx]; At A(:, selected); theta_tmp At \ y; r y - At * theta_tmp; if norm(r) 1e-6 break; end end theta_hat zeros(N, 1); theta_hat(selected) theta_tmp; end使用的时候感知矩阵A是Φ和Ψ的乘积而不是直接用Φ。这一点特别容易搞错。回收端在拿到测量值y之后先反量化还原出浮点y再调用OMP得到稀疏系数theta_hat最后用x_hat Psi * theta_hat还原图像块。% 反量化 y double(Yq) / 255.0 * (maxVal - minVal) minVal; % 重构稀疏系数 theta_hat OMP(y, Phi * Psi, sparsity); % 逆变换回图像块 x_hat Psi * theta_hat;整图重构就是循环处理每个块拼回去就行。我写代码的时候习惯把分块循环和重构逻辑放在同一个脚本里先跑通再封装成函数。好处是方便打印中间尺寸调试坏处是代码有点乱但作为一版实验代码可读性比工程规范更重要。4. 实验评估加密指标与图像质量怎么权衡4.1 加密侧看的指标信息熵、相关系数与直方图做图像加密方向的人应该对这些指标很熟悉但还是要说明一下它们在这里的具体涵义。信息熵衡量测量值灰度的随机程度。灰度图像的最大信息熵是8比特/像素越接近8说明灰度分布越均匀加密效果越好。明文图像的熵通常在7.0到7.5之间而压缩感知测量值经过量化后熵一般能做到7.9以上。我实测某张512×512测试图时明文熵是7.32密钥控制测量矩阵之后的密文熵到了7.91已经非常接近均匀分布。相邻像素相关系数是另一个经典指标。明文图像相邻像素之间的相关系数通常高达0.95以上而理想加密方案应该让密文相邻像素几乎不相关。这个指标的实测结果一般在0.01到0.05之间属于可接受范围。直方图方面明文直方图会呈现明显的山峰状而量化后的测量值直方图则平坦很多这也是信息熵升高的直观表现。这些指标的价值在于它们能证明“密钥控制测量矩阵”确实不只是在图像上做了一次线性变换而是把像素之间的结构性关联打散了。4.2 重构质量与采样率的权衡PSNR与SSIM怎么看加密是安全侧的问题重构质量是可用性侧的问题。两者之间的桥梁就是采样率SR M/N。我在16×16分块、OMP迭代上限24、稀疏度按块自适应的配置下用标准测试图跑过一组对照实验大致结果如下SR (M/N)压缩率平均PSNR (dB)平均SSIM每块重构耗时 (s)0.25倍26.30.830.0320.33.3倍29.60.880.0550.42.5倍32.80.930.0810.52倍35.40.960.126注意这组数据是特定参数下的参考值图像内容不同会有波动。但趋势非常明显采样率越高重构质量越好但压缩率越低计算时间越长。如果你只需要肉眼可辨SR0.25到0.3就够如果是要做后续识别任务建议SR不要低于0.4。还有一个容易被忽略的点稀疏度K的取值对重构质量影响极大。K太小图像细节被抹平K太大OMP会把噪声当成有效信号选进来图像会出现颗粒感。我的经验是K取M的三分之一到二分之一比较稳妥宁可少取一点也别让OMP去拟合残差里那些微小的噪声分量。4.3 错误密钥攻击实验有多敏感就有多安全评估加密算法不能只看正确密钥的重构效果还要看错误密钥下的表现。我做过一个很直观的测试把正确的混沌初值x00.3773改成0.37730000000001误差只有1e-14其余参数不变。结果重构图像的PSNR直接掉到8.2dB肉眼看起来就是一片雪花噪声完全看不出原图内容。这说明密钥敏感性是达标的。混沌系统初值微小的扰动经过几百次迭代后生成的混沌序列彻底偏移置乱索引也随之变成完全不同的排列最终测量矩阵面目全非。攻击者即使拿到了观测向量y在没有正确测量矩阵的情况下恢复出来的信号无论在稀疏域还是像素域都不具备任何可读性。不过这里有个隐蔽的问题错误密钥下图像是噪声这是好事但同时也意味着破解者可以有“选择明文攻击”的思路——他如果能让发送端对同一幅图像使用不同密钥生成多组测量值有可能通过差分分析找出测量矩阵的某些结构特征。对这种攻击的防御思路通常是在密钥派生阶段加入图像内容的哈希值让测量矩阵同时与密钥和图像内容相关这样每张图的矩阵都不一样差分分析就失效了。5. 参数调节、常见坑与实际建议5.1 采样率、稀疏度、重构算法三者怎么匹配压缩感知系统不是“参数设置得越大越好”而是要让几个核心参数互相匹配。采样率SR决定M的大小M又决定了OMP最多能恢复的非零系数个数。理论上只要信号的稀疏度K满足M≥cKlog(N/K)c是一个常数重构就有理论保障。工程上不用算这么细但你应该理解采样率20%时每块只有大约50个测量值16×16块你却告诉OMP稀疏度是60那算法必然在后面几轮迭代里开始选错原子把噪声当信号。反过来采样率很高但稀疏度设得很保守重构结果虽然干净却丢了纹理细节。我的建议是先把K设成M的0.3倍跑一遍看重构图像的PSNR然后逐步增大K观察PSNR曲线。曲线上升期说明稀疏度还不够曲线开始下降或者出现噪声颗粒说明K过大回头取峰值附近的值。这个过程虽然朴素但非常有效。另外要提一下重构算法的选择。OMP是入门首选代码简单、调试方便。但如果你是追求极致重构质量或者测量值数量很紧可以试一下SP或者CoSaMP它们在相同采样率下通常能恢复出质量更高的图像。代价是实现复杂度高而且需要做残差归一化等额外处理。我个人的项目里OMP跑不动的场景会换SP但教学和演示场景依然用OMP因为逻辑清楚不容易出诡异问题。5.2 我踩过的几个坑浮点一致性与量化边信息第一个坑就是前面提到的浮点一致性问题。Matlab在Windows和Linux上同一个Logistic迭代流程运行到几百步之后序列值可能会有细微差异。差异本身很小但一旦用于排序生成索引任何微小差异都会被放大成一个完全不同的索引排列。这意味着发端用Windows生成的测量矩阵和收端在Linux上重建的测量矩阵如果对不上重构结果必然一团糟而且你很难直观看出是密钥问题还是算法问题因为代码逻辑看起来完全一样。解决办法有三种。最省事的是收发端都跑在同一个平台同一版本Matlab下这只能算权宜之计。比较靠谱的做法是改用整数域生成混沌序列用定点运算代替浮点迭代保证跨平台一致。还有一种折中方案是提前生成并缓存一串足够长的混沌序列收发双方传输序列的序号而不是各自重新计算。我建议实验阶段用平台一致性的方案上生产系统再改用整数化方案。第二个坑是量化边信息的处理。我最初做量化时天真地想按固定最大值255来归一化结果测量值的动态范围在不同图像之间差异巨大固定范围要么浪费量化精度要么截断很多值。后来改成每块各自保存minVal和maxVal问题解决了但边信息量增加了。进一步优化可以只对少数能量异常的块单独保存范围大多数块使用全局范围这样边信息开销能压到非常小几乎不影响压缩率。第三个坑是分块边界。图像尺寸不能被16整除时直接reshape会报错。最省事的做法是在边界补零或者镜像扩展重构完再裁掉。镜像扩展的效果比补零好因为不会人为引入高频突变尤其在高倍压缩的时候边界伪影会非常明显。5.3 这套方案后续可以往哪些方向扩展做完基础的压缩加密混合算法之后扩展方向至少有这几个每一个都是能继续做下去的研究点。第一用深度学习重构替代OMP。目前已经有大量基于展开网络的重构方法重构质量和速度都比传统迭代算法好。关键是深度学习重构网络可以接受“测量值密钥信息”作为条件输入等于把密钥嵌入到重构过程里这在安全性和重构质量两个维度上都有提升空间。第二改成多用户场景。每个用户拥有不同的混沌密钥服务器对不同用户的测量值用不同测量矩阵解密实现“一对多”的保密图像分发。这个场景很适合做云端的图像安全共享服务。第三压缩感知重构与加密指标联合优化。很多人做优化只看PSNR但加密方案还要防攻击、防泄露如果能构建一个同时包含重构质量和安全性指标的联合损失函数在生成测量矩阵时做端到端学习理论上能得到比人工设计密钥矩阵更优的结果。这个方向还在快速演进中感兴趣的同学现在切入正合适。从目前我实际测试下来的情况来看基于密钥控制测量矩阵的方案在图像压缩传输场景里的定位很清晰它不追求“极致压缩率”也不追求“军用级加密强度”而是找一个轻量级、可部署、压缩加密一体化的平衡点。你只要把密钥派生、分块处理、量化边信息这几个环节处理扎实整个系统就能稳稳当当地跑起来。真正让我觉得这套方法值得推荐的原因不是某一个指标特别突出而是它在工程实践中的坑相对可控、调试路径清晰对初学者和工程人员都足够友好。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑