尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于Arnold变换的图像加密与解密算法详解及Matlab实现
做图像加密课题的人十有八九会先搜到“Arnold变换”。这个算法有一个很直白的名字叫猫脸变换最早是Arnold在研究遍历理论时拿猫脸照片做的演示后来被引用到图像位置置乱里成了多媒体安全方向最常讲的入门算法。如果你正在做图像加密相关的课程设计、大作业或者论文里的对比实验那么“基于Arnold变换的图像加密与解密算法研究Matlab代码”这类题目应该是非常经典的选择。这篇文章会把原理、完整思路、可用代码、坑位和评估方法全部写透希望能帮你从“抄代码跑通”跨越到“能讲清楚也能改代码”。1. Arnold变换的数学基础猫脸变换到底在做什么1.1 变换公式与几何意义Arnold变换的经典公式是二维离散线性映射对像素坐标做下面的运算在图像尺寸为 N×N 的网格上某个像素点原来的坐标是 (x, y)经过一次变换后变成 (x, y)一般写成x mod(x y, N) y mod(x 2y, N)把它写成矩阵形式就是[x] [1 1] [x] [y] [1 2] [y] mod N很多人第一次看到这个公式会想这不就是线性代数里的坐标变换吗为什么加个取模就能加密图像关键就在于 mod N 把所有坐标限制在有限的整数网格里。原来连续平面上的线性变换一旦落在离散的有限集合里就会变成一种“排列置换”每个像素点都有唯一的新坐标而且整个过程可逆。换句话说Arnold变换做的不是把图像揉成一团而是把所有像素点有条不紊地挪到别的位置。就像一屋子人按照规则换座位每个人最终坐到了不同椅子上但如果规则足够乱外人看上去就像完全随机打乱了一样。如果想要更通用的形式可以引入两个参数 a、bA [1 a; b a*b1]即x mod(x a*y, N) y mod(b*x (a*b1)*y, N)当 a1、b1 时就退化成最经典的猫脸变换。a、b 可以当作额外密钥虽然安全强度提升有限但在演示程序里多两个控制参数能让实验更有“参数敏感性”味道。1.2 周期性解密的天然钥匙Arnold变换有一个非常吸引人的性质周期性。因为坐标集合是有限的连续做同样的置换最终一定会回到原点。对 N256、a1、b1 的情况常见的说法是周期为 192。也就是说同一幅图像连续做 192 次Arnold变换后会原封不动变回自己。这个性质最方便的地方在于它提供了一种不需要算逆矩阵的解密思路如果你加密时做了 iter 次正向变换那么只需要再做 P-iter 次正向变换就能恢复原图。这里的 P 就是当前图像尺寸和变换参数下的周期。我最早做实验时解密是用逆矩阵公式硬算的。后来发现不少论文里直接用周期做正向补迭代这种方式更简洁而且不容易写错。只需要在代码里预先求出一个周期 P按照周期做一次取模运算剩下的就全部复用正向置乱函数。不过这也会带来一个实际问题图像尺寸 N 不同周期也会不同。比如 N128 和 N256 的周期就不一样如果加密参数 a、b 也变了周期还得重新算。所以代码里必须写一个自动求周期的函数不能把周期写死成 192。1.3 为什么只适合做置乱模块很多人以为Arnold变换就是完整的图像加密算法实际并不是。Arnold变换只改变像素的位置不改变像素的灰度值。也就是说它做的是“置乱”而不是“扩散”。如果不做灰度值的扩散处理加密图像的直方图和原图几乎一模一样。什么叫直方图一模一样就是图像里某个灰度值有多少个像素点加密前后像素点的数量基本对应一致只是排列位置变了。攻击者看直方图就能大概知道原图的灰度分布。这显然不满足现代密码学对“密文随机性”的要求。Arnold变换的正确身份应该是图像加密系统里的前置置乱层或者干脆用于水印、视觉保密、人脸隐私脱敏这类场景。如果要做成完整的加密系统通常需要在Arnold变换之后再接一层灰度值扩散/XOR操作这样才能让密文直方图变得均匀。2. 加密与解密链路设计对称置乱方案的完整闭环2.1 加密端流程完整的加密流程并不复杂核心步骤可以拆成下面几段第1步读取图像并做预处理。Arnold变换要求图像是 N×N 正方形因为公式里的取模维度是同一个 N。如果你拿到的是矩形图要么先裁剪成方形要么补零扩展成方形要么把RGB三个通道拆开后分别处理。第2步确定置乱参数。常见参数主要是 a、b 和迭代次数 iter。a、b 是变换矩阵里的整数系数iter 是重复置乱次数。理论上 iter 足够大后图像会看起来完全混乱但最好不要超过周期否则在周期性作用下会逐渐绕回来。第3步执行正向Arnold置乱。每个像素点根据公式移动到新的位置重复 iter 次。第4步输出加密图像。到这里视觉上已经完全看不出原始内容常见学生会直接把这个结果叫做密图。第5步如果是完整安全系统再对像素灰度值做扩散处理比如按位XOR伪随机序列这一步可以改变直方图分布。2.2 解密端流程解密是加密的逆过程思路有两种。第一种是数学求逆。正向变换矩阵 A 的行列式为 1所以可逆其逆矩阵可以算出来然后对密图坐标应用逆变换即可。这种方法需要小心推导逆矩阵和取模的处理。第二种是利用周期性。因为总周期 P 已知如果加密迭代了 iter 次那么对密图再做 P - mod(iter, P) 次正向变换就能还原。代码里通常会用第二种因为只需要维护一个函数逻辑最简单。不过必须强调无论采用哪种解密方法都要求图像尺寸 N、参数 a、b 和原始加密过程保持一致。哪怕其中任何一个参数差一点解密结果都会是一张看不出内容的乱码图。这其实也是图像加密实验里最常见的翻车点。2.3 RGB彩色图如何处理上面说的都是灰度图初学者在这里常常卡壳。Arnold变换是基于二维坐标的对单通道图像最自然。彩色图有三个通道 R、G、B每个通道单独看都是一个灰度矩阵。处理彩色图有两种常见思路。第一种是拆通道后并行置乱。把彩色图的三个通道拆开各自当作 N×N 的矩阵用同一套参数分别做Arnold变换最后再合并成一个三通道图像。这种方式实现简单视觉上置乱效果也很好。第二种是变换前先转灰度图。很多课程作业只要求验证算法转成灰度图最省事。但要注意彩色转灰度会丢失颜色信息如果原需求是彩色图像加密那就需要保留通道信息。在实际项目里建议把核心函数写成只处理二维矩阵然后在外层用循环或数组操作分别处理三个通道。这样的代码结构更清晰也方便以后扩展其他算法。3. Matlab完整实现可直接运行的代码与逐段解读3.1 核心置乱函数 arnold_core我先写一个核心函数它负责执行广义Arnold变换。function J arnold_core(img, a, b, iter) % ARNOLD_CORE 广义Arnold图像置乱核心函数 % 输入 % img : 正方形灰度图像尺寸 N×N % a,b : Arnold变换矩阵参数 % iter : 正向置乱迭代次数 % 输出 % J : 置乱后的图像 % % 变换公式 % x mod(x a*y, N) % y mod(b*x (a*b1)*y, N) if ndims(img) ~ 2 error(arnold_core 仅支持单通道灰度图像RGB请在外层分别处理); end [N, M] size(img); if N ~ M error(Arnold变换要求图像为正方形请先裁剪、缩放或补零); end if iter 0 error(迭代次数必须为非负整数); end % 记录所有像素的原始存储坐标注意Matlab下标从1开始但变换公式按0开始计算 [oldY, oldX] ndgrid(0:N-1, 0:N-1); % 对坐标做 iter 次正向变换得到每个原始像素最终应该去的位置 x oldX; y oldY; for k 1:iter xn mod(x a*y, N); yn mod(b*x (a*b1)*y, N); % 注意Arnold公式里的 x、y 要用上一轮的值不能就地覆盖后马上参与y计算 x xn; y yn; end % 通过线性索引完成整幅图像的像素搬移 oldIdx sub2ind([N, N], oldY(:) 1, oldX(:) 1); newIdx sub2ind([N, N], y(:) 1, x(:) 1); J zeros(N, class(img)); J(newIdx) img(oldIdx); end这份代码最关键的地方不是我循环了 iter 次而是我在坐标矩阵上完成了 iter 次映射后才一次性搬移像素值。很多网上版本喜欢写成三层嵌套循环for i 1:N for j 1:N for t 1:iter xn mod(i-1 j-1, N) 1; yn mod(i-1 2*(j-1), N) 1; end end end这种写法在 N64 时还能忍一旦跑到 N512、iter 几十次速度会慢到让人崩溃。因为每个像素你都要在MATLAB脚本层跑好几层循环而MATLAB本身不擅长大量标量循环。我推荐的思路是把所有像素的坐标当成矩阵来算每一轮迭代都直接操作 N×N 的坐标矩阵最后用 subs 一次完成像素搬移。这样代码不但行数少运行速度也快很多。需要提醒的是坐标起点问题。MATLAB的矩阵下标从 1 开始但Arnold公式里 mod 运算习惯从 0 到 N-1。如果你直接拿像素 i、j 去加很容易出现下标越界。所以我一开始用 ndgrid(0:N-1, 0:N-1)最后再通过 sub2ind 加 1 转回Matlab下标。这个细节非常容易漏漏了要么报错要么解密后图像整体偏移。3.2 自动求周期函数 arnold_period解密时要利用周期所以还要写一个能自动求周期的函数。function T arnold_period(N, a, b, maxIter) % ARNOLD_PERIOD 自动计算广义Arnold变换在 N×N 网格上的周期 % 输入 % N : 图像边长 % a,b : 变换参数 % maxIter : 搜索周期的最大迭代次数 % 输出 % T : 周期 [oldY, oldX] ndgrid(0:N-1, 0:N-1); x oldX; y oldY; for k 1:maxIter xn mod(x a*y, N); yn mod(b*x (a*b1)*y, N); x xn; y yn; if isequal(x, oldX) isequal(y, oldY) T k; return; end end error(在 maxIter%d 内未找到周期请增大maxIter或检查参数是否合法, maxIter); end对这个函数我只做一个提醒maxIter 不要设置太小。不同 N 对应的周期差异很大某些 N 值下周期可能超过几百。我一般习惯写成 1000因为即使 N512这个函数的运行开销也不大主要也就是做矩阵加法、取模和 isequal 判断。不同参数 a、b 也会影响周期。如果你把 a、b 当作密钥的一部分那么周期必须动态计算否则解密很容易翻车。3.3 完整演示主脚本把核心函数拼起来就是一份能直接出图的完整脚本。%% 基于Arnold变换的图像加密解密演示 clear; clc; close all; % 1. 读取测试图并转为灰度正方形图 try I imread(cameraman.tif); catch error(未找到cameraman.tif请把该图片放到当前工作目录或用imread读取自己的图片); end if size(I, 3) 3 I rgb2gray(I); end N min(size(I, 1), size(I, 2)); I I(1:N, 1:N); if ~isa(I, uint8) I im2uint8(I); end % 2. 加密参数 a 1; b 1; iter 15; % 3. 加密 enc arnold_core(I, a, b, iter); % 4. 解密利用周期性做反向还原 P arnold_period(N, a, b, 1000); iterMod mod(iter, P); if iterMod 0 iterDec P; else iterDec P - iterMod; end dec arnold_core(enc, a, b, iterDec); % 5. 可视化 figure; subplot(1, 3, 1); imshow(I); title(原始图像); subplot(1, 3, 2); imshow(enc); title(加密图像); subplot(1, 3, 3); imshow(dec); title(解密还原图像);实测下来这段代码对 cameraman 这类内置测试图可以非常稳定地完成“原图—密图—解密图”的闭环。画面显示上加密图看起来像白噪声一样的乱码点阵解密图和原图逐像素几乎完全一致。这里再强调一个使用习惯如果你想把彩色图加密最简单的方式是先把彩色图拆成 R、G、B 三个单通道分别调用 arnold_core再用 cat(3, r, g, b) 合并起来。不要直接把三通道数组交给 arnold_core因为我的函数里已经加了维度报错保护那样做会直接报“仅支持单通道灰度图像”。4. 解密对不上、图像花了常见问题与排查技巧4.1 快速定位表我在做实验和辅导别人跑代码的过程中遇到过不少反复踩坑的问题这里整理成一个速查表。现象最可能的原因解决方法报错“要求图像为正方形”输入的测试图是矩形或者长宽不相等先裁剪成正方形或补零扩展或用 imresize 缩放报错“仅支持单通道灰度图像”直接把RGB三通道数组传入核心函数把彩色图拆分通道每个通道分别调用核心函数加密图正常解密图完全乱码解密时的a、b、iter与加密时不一致核对参数建议用脚本变量统一控制解密图有轮廓但像蒙了一层噪声图像在加密后经过了有损压缩、缩放过等操作PNG、BMP这类无损格式用于保存密图不要用低质量JPEG解密后图像整体偏移或坐标错乱坐标0起点和Matlab下标1起点弄混用ndgrid(0:N-1,0:N-1)生成坐标最后用sub2ind转下标加密图像花得不够彻底能看出轮廓iter太小或图像尺寸较小、周期较短适当增大iter先迭代到接近半个周期再观察程序跑得特别慢大图卡死使用三层标量循环方式遍历全部像素改用坐标矩阵向量化方案见arnold_core函数这张表覆盖了我遇到过的绝大多数问题。如果你的现象不在表里可以沿着“参数是否一致、图像是否正方形、坐标起点是否正确、是否有损压缩”这条排查路径逐项检查。4.2 为什么解密用周期而不是逆矩阵很多初学者会有一个疑问既然是加密算法为什么解密时不用逆矩阵反而继续做正向变换原因在于Arnold变换的周期性实在太方便了。假设你已经知道周期 P192加密时做了 iter15 次变换。在群的概念里正向变换做15次得到的状态再做177次就会回到原来的状态因为15177192。所以只需对密图继续做177次正向变换就能还原出原始图像。这种方式的另外一个好处是加密和解密用的代码是同一个函数。只要确认加密函数没问题解密大概率也不会错。如果硬要用逆矩阵还需要额外推导并实现逆变换公式写反或者取模处理不对都会导致加密图恢复不出来。我自己在写代码时其实两种方式都试过。最后更推荐周期法因为它的逻辑更贴近公式本身排查问题时也更容易定位先看周期算得对不对再看迭代次数取模对不对。4.3 常见的数学细节坑Arnold变换看起来只有几行公式但对“取模”的处理必须非常小心。第一个坑是负数取模。在逆变换公式里经常会出现类似 mod(-x, N) 的情况。不同编程语言对负数取模的定义不一样MATLAB的 mod 结果始终是非负的这个没问题。但如果你后期把代码迁移到其他语言要特别注意负数取模的结果必要时自己补一个正向偏移。第二个坑是坐标起点。公式里用 x0、y0 表示左上角但在MATLAB里是 x1、y1。如果你写完代码后图像加密效果正常但解密后图像发生了整体移位大概率就是起点处理不一致。第三个坑是周期与尺寸的关系。不同尺寸 N 的周期完全不一样。如果强行把某个固定周期写死在代码里换一张不同尺寸的图就会解密失败。5. 安全性分析为什么Arnold变换只能算基础模块5.1 它不改变像素灰度值的致命短板回到做图像加密这个课题的初衷我们最终想要的是别人拿到密图后无法获取原始视觉信息、无法推测原始图像分布。Arnold变换做的是坐标置换图像的灰度直方图没有本质变化。假设原图是一张医学影像背景区域灰度值很集中置乱后的密图虽然人眼看不出轮廓但直方图上那些陡峭的峰和谷仍然泄露了原图信息。对于灰度量化级较低的图像直方图几乎就是明牌。只做位置置乱不改变像素值是Arnold变换最明显的短板。在实验报告里如果你只写一个Arnold变换加密并声称绝对安全评审老师大概率会质疑这一点。正确表述应该是Arnold变换是一种高效的图像置乱预处理方法通常需要与像素灰度值扩散模块配合构成完整的图像加密系统。5.2 密钥空间与已知明文攻击的问题进一步分析如果仅使用Arnold变换作为完整加密手段还存在密钥空间较小的问题。可用参数无非是变换矩阵里的 a、b以及迭代次数 iter。图像尺寸是公开的攻击者哪怕不知道具体 a、b也可以通过暴力尝试有限参数组合配合直方图或图像质量指标来判断是否恢复成功。此外位置置乱算法对已知明文攻击敏感。如果攻击者拥有若干原图和对应密图他就等于拿到了若干组坐标映射关系。对固定尺寸、固定参数的系统通过对比原图和密图可以直接重建置换表之后再加密或解密任意图像都非常容易。这听起来有点悲观但这不是Arnold变换本身的问题而是位置置乱类算法的通用局限。在实际设计和论文实验里Arnold变换一般只当作加密链路中的第一个模块后面还要接像素值替换、混沌序列XOR、扩散层等步骤。5.3 推荐的安全增强路线如果你希望在课程设计里体现更完善的安全思路可以沿着这几个方向扩展。第一加扩散层。Arnold置乱后对整幅图像按像素与一个伪随机矩阵做按位XOR最常用的是基于Logistic混沌序列生成随机矩阵。这一步会彻底改变灰度直方图让密文接近均匀分布。第二引入多轮置乱与交替扩散。不要一次性把迭代次数堆很大而是置乱少量几次之后马上做一次扩散再继续置乱、再扩散。这样位置关系和像素值关系都被充分打乱抵抗差分攻击的性能会好很多。第三做混沌系统的参数敏感性实验。很多图像加密论文会对比几组由微小差异生成的密钥观察解密结果是否完全失败。Arnold变换本身没有密钥生成器但可以和混沌系统组合起来把混沌初始值当作整体密钥。第四比较置乱前后的评价指标。加密图像性能评估不能只靠人眼“看不出来”还要给出峰值信噪比、信息熵、相邻像素相关系数、像素变化率等定量数据。这样实验部分会显得更扎实。6. 实验效果与量化评估怎么让PPT和报告更有说服力6.1 人眼观察之外还需要哪些指标做图像加密实验只放三张图往往不够因为“看起来像噪声”本身并不是严格的量化判断。我在写课程报告时一般会补充下面几个指标。峰值信噪比PSNR。加密图像相对于原图的PSNR越低说明两幅图像差异越大加密效果越明显。通常Arnold置乱后的PSNR会掉到10dB附近肉眼看起来就是白噪声。解密图像相对于原图的PSNR越高越好理想情况下应该是无穷大因为Arnold变换本身没有信息损失。图像熵。信息熵反映灰度分布的不确定性。普通灰度图的信息熵可能在7左右但位深8bit的图像理论上限是8 bit。若只有置乱不做扩散加密前后信息熵变化很小这个指标恰好可以证明“Arnold本身不是完整加密”。如果接上扩散层密图的信息熵会明显趋近8。相邻像素相关系数。自然图像同一行的相邻像素往往相关性很强数值接近0.9以上。置乱后像素被乱序排列相邻像素相关性会大幅下降。这个指标可以从水平、垂直、对角线三个方向分别计算非常能说明置乱效果。像素平均移动距离和移动率。统计原图每个像素置乱后的坐标变化量算出平均移动像素距离。像素移动率高于99%说明图像大部分像素都发生了位置改变只有极少数固定点没动。这个指标能直观看出Arnold的“混乱程度”也顺便暴露原点附近可能存在的固定点问题。6.2 实验展示的合理结构如果你要做成报告PPT我建议用一张四宫图原始图像、加密图像、错误密钥解密图像、正确密钥解密图像。第一张和最后一张要看起来几乎一致第二张要像噪声第三张要像完全乱的雪花。这样的视觉冲击力最强也最直观。右侧可以配一个表格列出原图和密图的相关系数、信息熵、PSNR、像素移动率等数据。下面再放一组直方图原图直方图、Arnold密图直方图、扩散后密图直方图。通过这三张直方图能很好地解释“只置乱不够、必须加扩散”的结论。另外我还建议做一个迭代次数扫描实验分别把 iter 设成 1、5、10、50、100、192观察图像从轻微乱序到完全混乱、再到周期性回原点的过程。对于N256参数(a,b)(1,1)的图像iter192时会回到原图这是Arnold周期性的最好展示。这个实验只需要在脚本里套一层循环就能生成一组非常有说服力的结果图。6.3 我的实测体验以我自己日常实验为例
RELATED

相关推荐

高校微博舆情分析系统实战:Hadoop+Spark+Hive全链路解析

高校微博舆情分析系统实战:Hadoop+Spark+Hive全链路解析

1. 项目概述与整体设计思路这阵子帮学校信息中心做了一个高校微博舆情分析系统,技术栈正好是Hadoop Spark Hive Flask这套经典大数据组合。整体跑下来,从数据采集到分析展示全链路打通,所以打算把这次的项目经验完整梳理一遍,尤…

📅 2026/9/9 6:10:12
Doris集群扩缩容实战指南:从BE数据均衡到FE节点管理

Doris集群扩缩容实战指南:从BE数据均衡到FE节点管理

1. 扩容与缩容的本质:先想清楚你要解决什么问题在聊Doris集群扩缩容之前,我先把话说在前面:这两件事很多人当成"加机器/减机器"的纯运维操作,实际上远没那么简单。扩缩容的背后,是存储容量、查询性能、副本分…

📅 2026/9/9 6:10:12
openEuler上自建MicroBin:轻量粘贴板工具部署与运维实践

openEuler上自建MicroBin:轻量粘贴板工具部署与运维实践

如果你平时经常在内网服务器上传代码片段、排查日志片段,或者想临时把一段配置分享给同事,一定会遇到一个很现实的问题:微信聊天记录里的文本容易丢,邮件发来发去太麻烦,直接贴到公网的“粘贴板”站点又碰一鼻子灰——…

📅 2026/9/9 6:05:12
MORE NEWS

更多资讯

📰

智慧景区边缘计算落地实践:架构设计、算力选型与多业态数据融合

去年年中,我接手了一个智慧景区项目,主题就是“边缘计算与多业态融合”。一开始我觉得这名字有点大——景区嘛,无非就是闸机、广播、监控、停车,拢共也就那么几个系统。可真等方案评审和现场部署跑下来,我才意识到&…

📰

机器人常用命令实战:从SSH连接到ROS2调试排查

我到现在还记得第一次去现场调移动机器人的情景:屏幕上日志滚得飞快,测试工程师问我下一步该敲什么命令,我愣了好一会儿,最后只能心虚地回一句“我查一下文档”。后来这些年项目越做越杂,从底盘通信、机械臂轨迹到传感…

📰

SAP PO接口配置完整指南:从ESR建模到ID配置与排错

聊到PO接口,干过SAP集成的朋友应该都懂,这词儿被叫得太泛了。有人以为PO指采购订单(Purchase Order)的报文接口,有人以为是SAP那套中间件。其实在SAP技术栈里,PO更常见的含义是Process Orchestration&#…

📰

SSH免密登录原理与实战:从密钥配置到安全加固全指南

干过运维的都知道,SSH免密登录这事有多重要。我每天至少要连十几台服务器,要是每台都敲密码,光输错几次密码再等三秒钟重试的时间,就够我写完一个脚本了。更别提那些凌晨三点爬起来处理告警的时刻,你刚把密码敲完发现少…

📰

蓝牙6.0时代如何选型音频芯片?别只看版本号,这3个参数是关键

前几天有个做TWS的客户拿了一颗所谓的“蓝牙6.0”样品来找我,开口第一句就是:“这个支持蓝牙6.0,成本比现在用的还便宜两毛钱,要不要换?”我反手把他带到实验室,在频谱仪上跑了一遍射频指标,又拿…

📰

三款Web端开源ER图工具推荐:数据库设计与建模效率提升指南

画 ER 图这件事,几乎每个做数据库设计的人早晚都会碰上。不管你是做课程设计需要画几张实体关系图交作业,还是开发前要梳理表结构,甚至只是想给老项目的数据库反推出一份能看懂的关系图,一个趁手的 ER 图设计工具能省下大量时间。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬