
簡(jiǎn)介基于MATLAB的圖像加解密及傳輸仿真課程設(shè)計(jì)資源包面向電子信息、通信工程、計(jì)算機(jī)等專(zhuān)業(yè)在校生可用于課程設(shè)計(jì)、大作業(yè)或畢業(yè)設(shè)計(jì)選題。資源針對(duì)圖像加密、解密及傳輸鏈路仿真需求提供完整可運(yùn)行的MATLAB源碼、標(biāo)準(zhǔn)測(cè)試圖像、加密/解密數(shù)據(jù)文件、Fig仿真界面及項(xiàng)目說(shuō)明文檔覆蓋從算法實(shí)現(xiàn)到結(jié)果驗(yàn)證的主要環(huán)節(jié)。包體共10個(gè)文件以mat數(shù)據(jù)文件、m腳本、md說(shuō)明文本、bmp圖像和fig模型文件為主整體僅435KB輕量易部署。目前已有102人學(xué)習(xí)下載適合需要快速上手圖像安全處理仿真的讀者。項(xiàng)目曾獲答辯評(píng)審95分代碼經(jīng)過(guò)嚴(yán)格測(cè)試運(yùn)行成功具備較高參考價(jià)值讀者既可直接復(fù)用也可在源碼基礎(chǔ)上擴(kuò)展算法或界面功能用于實(shí)驗(yàn)報(bào)告撰寫(xiě)或進(jìn)一步研究。1. 為什么用MATLAB做圖像加解密及傳輸仿真在課程設(shè)計(jì)里MATLAB圖像加解密及傳輸仿真是一道經(jīng)典綜合題既要實(shí)現(xiàn)加密算法又要模擬信道噪聲還要把解密恢復(fù)的圖像質(zhì)量量化。項(xiàng)目源碼包里提供了完整流程LENA256.BMP作為測(cè)試圖key1.mat保存密鑰Cypher1.mat保存密文還有untitled1.m主程序和帶交互界面的untitled1.fig。和很多只貼一個(gè)加密函數(shù)的教程不同它把發(fā)送端加密、信道傳輸、接收端解密串在了一起適合正在做MATLAB大作業(yè)、課程設(shè)計(jì)或打算做畢業(yè)設(shè)計(jì)初稿的同學(xué)。拿到壓縮包后先別急著跑代碼看懂文件之間的數(shù)據(jù)依賴(lài)后面調(diào)參和答辯都有底。下面直接按這個(gè)順序把項(xiàng)目拆開(kāi)講。2. 項(xiàng)目文件結(jié)構(gòu)與圖像加解密傳輸模型選型2.1 源碼包里的文件各負(fù)責(zé)什么打開(kāi)壓縮包里面是典型的MATLAB課程設(shè)計(jì)工程結(jié)構(gòu)。逐個(gè)說(shuō)明untitled1.m主腳本包含讀圖、加密、傳輸仿真、解密、畫(huà)圖全流程。untitled1.figGUIDE界面文件雙擊或用openfig打開(kāi)后可手動(dòng)修改密鑰參數(shù)。LENA256.BMP256x256的8位灰度測(cè)試圖圖像處理領(lǐng)域最常用的標(biāo)準(zhǔn)圖。key1.matMATLAB數(shù)據(jù)文件保存了加密時(shí)用到的混沌映射初值x0、控制參數(shù)μ以及二值密鑰序列。Cypher1.mat保存加密后的密文圖像矩陣用于對(duì)比不同信道條件下的解密效果。CypherRec1.mat保存接收端解密輸出理論上應(yīng)與原始圖一致。README.md和部署說(shuō)明文檔.md說(shuō)明運(yùn)行環(huán)境、依賴(lài)工具箱和操作步驟。.mat文件在MATLAB里用load加載。一個(gè)很實(shí)用的技巧是先用whos查看變量名避免直接使用load(key1.mat)后不知道變量叫什么file whos(-file, key1.mat); disp({file.name}); loaded load(key1.mat);參數(shù)說(shuō)明whos的-file參數(shù)不會(huì)把數(shù)據(jù)讀入內(nèi)存只打印變量名load加返回值會(huì)把數(shù)據(jù)放進(jìn)結(jié)構(gòu)體loaded比裸load更安全不會(huì)覆蓋工作區(qū)同名變量。這個(gè)細(xì)節(jié)在多人協(xié)作或二次開(kāi)發(fā)時(shí)能省去不少排查時(shí)間。2.2 為什么選Arnold置亂Logistic混沌異或而不是AES課程設(shè)計(jì)選題時(shí)通常有兩個(gè)方向一是直接用AES/DES這類(lèi)成熟分組密碼二是用混沌密碼學(xué)做輕量級(jí)圖像加密。這里的項(xiàng)目采用的是后者原因是圖像數(shù)據(jù)自帶極強(qiáng)的空間相關(guān)性和冗余度AES做圖像加密會(huì)把每個(gè)像素當(dāng)成獨(dú)立字節(jié)雖然安全但是效率低、演示不直觀。而Arnold置亂加混沌異或的優(yōu)點(diǎn)是Arnold置亂只改變像素位置不改變像素值配合迭代次數(shù)k可以快速讓圖像變成噪聲狀。Logistic混沌映射生成的序列對(duì)初值極其敏感適合做密鑰流。代碼量小幾十行就能講完答辯時(shí)思路清晰。Arnold置亂的標(biāo)準(zhǔn)變換是[x; y] [1 a; b a*b1] * [x; y] mod N當(dāng)取a1、b1時(shí)變換矩陣為[1 1; 1 2]。這個(gè)變換是周期性的256x256圖像的周期是192次。也就是說(shuō)如果迭代192次圖像會(huì)回到原始狀態(tài)。正因?yàn)橹芷诠潭ㄖ脕y輪數(shù)k本身可以當(dāng)作密鑰的一部分增加破解難度。Logistic映射公式x(n1) μ * x(n) * (1 - x(n))μ在[3.57, 4)之間進(jìn)入混沌區(qū)間x0是初值必須落在(0,1)。實(shí)際課程設(shè)計(jì)里x0和μ就是密鑰的兩個(gè)核心維度。加一個(gè)異或步驟是為了改變像素值的統(tǒng)計(jì)直方圖因?yàn)閱渭冎脕y不會(huì)改變灰度直方圖攻擊者還能從直方圖推斷原始圖信息。置亂負(fù)責(zé)打亂位置異或負(fù)責(zé)打亂數(shù)值兩者組合后加密圖像的直方圖會(huì)接近均勻分布這個(gè)特性在第3章會(huì)直接驗(yàn)證。2.3 傳輸仿真在模擬什么信道傳輸仿真模塊要解決的是“密文在信道中受到干擾后接收端還能不能正確解密”的問(wèn)題。這里用awgn加高斯白噪聲用imnoise加椒鹽噪聲分別模擬模擬信道失真和數(shù)字傳輸中的隨機(jī)比特錯(cuò)誤。噪聲類(lèi)型函數(shù)關(guān)鍵參數(shù)適用場(chǎng)景高斯白噪聲awgn(encrypted, SNR_dB, measured)信噪比SNR_dB單位dB無(wú)線信道熱噪聲、量化噪聲椒鹽噪聲imnoise(encrypted, salt pepper, d)噪聲密度d0~1脈沖干擾、傳輸誤碼選型依據(jù)是高斯白噪聲是加性干擾影響每一個(gè)像素但幅度小椒鹽噪聲只影響少數(shù)像素但幅度極大。兩類(lèi)噪聲對(duì)混沌加密系統(tǒng)的影響完全不同前者逐像素輕微改變后者造成局部完全丟失。答辯時(shí)把兩類(lèi)噪聲都跑一遍比只展示無(wú)噪聲情況更有說(shuō)服力。3. 核心代碼拆解從讀圖到加密輸出的完整鏈路3.1 圖像讀取與預(yù)處理untitled1.m的第一段通常是初始化環(huán)境并讀取測(cè)試圖。為避免通道問(wèn)題先判斷是否為灰度圖clear; close all; clc; img imread(LENA256.BMP); if size(img, 3) 3 img rgb2gray(img); end [M, N] size(img); orig im2double(img);邏輯說(shuō)明LENA256.BMP本身是單通道灰度圖但加上rgb2gray分支后換成任意彩色圖像也不會(huì)報(bào)錯(cuò)。im2double把uint8的0-255映射到0-1浮點(diǎn)數(shù)這是后續(xù)混沌運(yùn)算的必要前提。如果直接拿uint8做異或和浮點(diǎn)運(yùn)算MATLAB會(huì)頻繁轉(zhuǎn)換類(lèi)型反而容易出錯(cuò)。M和N分別是圖像行數(shù)和列數(shù)后面生成密鑰序列和置亂坐標(biāo)都要用。預(yù)處理這一步還建議順手記錄原圖直方圖figure(Name, 原始圖像直方圖); imhist(orig); title(LENA256 原始直方圖);觀察原始直方圖可以發(fā)現(xiàn)灰度分布不均勻主要集中在某些灰度帶上。加密后再看密文直方圖對(duì)比會(huì)更明顯。3.2 混沌密鑰流生成與保存密鑰流的具體實(shí)現(xiàn)用Logistic映射迭代M*N次再二值化成與圖像同尺寸的矩陣。這里給出的是典型的邏輯x0 0.43780; mu 3.9846; seq zeros(1, M*N); x x0; for i 1:M*N x mu * x * (1 - x); seq(i) x; end key_bin reshape(seq 0.5, M, N); save(key1.mat, x0, mu, key_bin);參數(shù)說(shuō)明x00.43780是初值mu3.9846接近4但不超過(guò)4實(shí)測(cè)混沌特性足夠好。二值化閾值取0.5等于序列均值附近這樣生成的0和1數(shù)量大致相等保證異或后像素反轉(zhuǎn)概率接近50%。save語(yǔ)句把原始參數(shù)和二值序列一起存入key1.mat。這里有個(gè)容易踩的坑如果后續(xù)把key1.mat里的key_bin直接當(dāng)密鑰使用而不保留x0和mu解密端就無(wú)法重新生成同樣的序列所以一定要把參數(shù)一并保存。更安全的做法是只保存x0和mu接收端按同樣規(guī)則再生成一遍key_bin這樣即使有人拿到.mat文件也拿不到完整密鑰流。3.3 Arnold置亂與異或加密實(shí)現(xiàn)置亂循環(huán)是加密部分最耗時(shí)的代碼先用一個(gè)易于理解的循環(huán)版本A [1 1; 1 2]; % Arnold變換矩陣a1,b1 k 30; % 置亂輪數(shù) scrambled orig; for t 1:k temp scrambled; for i 1:M for j 1:N ni mod(A(1,1)*(i-1) A(1,2)*(j-1), M) 1; nj mod(A(2,1)*(i-1) A(2,2)*(j-1), N) 1; temp(ni, nj) scrambled(i, j); end end scrambled temp; end % 用密鑰流對(duì)置亂圖做異或key_bin為1的位置取反 encrypted scrambled; encrypted(key_bin 1) 1 - encrypted(key_bin 1); save(Cypher1.mat, encrypted, k, A);邏輯說(shuō)明置亂部分外層循環(huán)控制輪數(shù)內(nèi)層遍歷所有坐標(biāo)。mod(..., M) 1是為了把0到M-1的數(shù)學(xué)坐標(biāo)映射回MATLAB的1到M索引。每輪置亂后圖像看起來(lái)完全像噪聲但像素值分布并沒(méi)有改變。異或部分通過(guò)邏輯索引key_bin 1選中需要反轉(zhuǎn)的像素執(zhí)行1 - x對(duì)應(yīng)二進(jìn)制中的0和1互換。因?yàn)閳D像值在[0,1]異或反轉(zhuǎn)就是取補(bǔ)。Cypher1.mat里保存密文圖像、輪數(shù)k和置亂矩陣A解密時(shí)要用。3.4 加密效果驗(yàn)證直方圖與相關(guān)系數(shù)跑完上述代碼后驗(yàn)證加密效果比看肉眼更重要figure; subplot(1,2,1); imhist(orig); title(原始圖像直方圖); subplot(1,2,2); imhist(encrypted); title(加密圖像直方圖);對(duì)比兩個(gè)直方圖原始圖灰度分布不均勻加密圖近似均勻平坦說(shuō)明異或操作有效破壞了像素值統(tǒng)計(jì)特性。還可以計(jì)算相鄰像素相關(guān)系數(shù)原始圖在水平、垂直方向相關(guān)系數(shù)通常接近0.9加密后應(yīng)接近0。這個(gè)指標(biāo)是圖像加密論文里必須給的數(shù)據(jù)寫(xiě)進(jìn)課程設(shè)計(jì)報(bào)告很加分。% 計(jì)算水平方向相鄰像素相關(guān)系數(shù) horiz_corr corr2(orig(:,1:end-1), orig(:,2:end)); enc_horiz_corr corr2(encrypted(:,1:end-1), encrypted(:,2:end)); fprintf(原始水平相關(guān)系數(shù): %.4f\n, horiz_corr); fprintf(加密水平相關(guān)系數(shù): %.4f\n, enc_horiz_corr);參數(shù)說(shuō)明corr2是MATLAB圖像處理工具箱中計(jì)算二維相關(guān)系數(shù)的函數(shù)。原始LENA256的水平相關(guān)系數(shù)通常在0.9以上加密后應(yīng)低于0.1甚至出現(xiàn)微小的負(fù)值。如果加密后相關(guān)系數(shù)仍然很高說(shuō)明置亂輪數(shù)不夠或者密鑰流與圖像尺寸不匹配。4. 傳輸信道仿真與解密恢復(fù)實(shí)戰(zhàn)4.1 高斯白噪聲與椒鹽噪聲模擬傳輸仿真的輸入是密文圖像。把encrypted當(dāng)作發(fā)送端輸出接收端看到的是經(jīng)過(guò)信道后的received% 高斯白噪聲信道信噪比15dB SNR_dB 15; received_gauss awgn(encrypted, SNR_dB, measured); % 椒鹽噪聲信道噪聲密度0.02 received_salt imnoise(encrypted, salt pepper, 0.02); % 對(duì)超出[0,1]范圍的值截?cái)啾苊饨饷軙r(shí)出現(xiàn)大于1的像素 received_gauss min(max(received_gauss, 0), 1);參數(shù)說(shuō)明awgn的第三個(gè)參數(shù)measured表示先測(cè)量輸入信號(hào)功率再疊加指定信噪比的高斯噪聲。這里信噪比取15dB屬于中等強(qiáng)度噪聲。imnoise的salt pepper類(lèi)型中0.02表示大約2%像素被隨機(jī)置為0或1模擬數(shù)字信道中的誤碼。加噪聲后必須截?cái)嗟絒0,1]因?yàn)樵?5dB信噪比下高斯噪聲會(huì)把一部分值推出合法區(qū)間直接解密會(huì)產(chǎn)生無(wú)意義的負(fù)像素或大于1的像素這些都是物理上不存在的灰度值。進(jìn)一步觀察誤碼對(duì)二進(jìn)制密文的影響可以把浮點(diǎn)圖像量化為二進(jìn)制比特流然后模擬單比特翻轉(zhuǎn)bits_in double(encrypted(:) 0.5); % 簡(jiǎn)單二值化 bits_err bits_in; idx randi(length(bits_err), 1, 10); % 隨機(jī)翻轉(zhuǎn)10個(gè)bit bits_err(idx) 1 - bits_err(idx); fprintf(誤比特率: %.6f\n, mean(bits_in ~ bits_err));這段是輔助理解混沌系統(tǒng)的雪崩效應(yīng)實(shí)際傳輸仿真中因?yàn)楦↑c(diǎn)尺度不同不需要過(guò)于精確。4.2 解密端恢復(fù)異或逆變換與反向Arnold置亂解密流程與加密完全對(duì)稱(chēng)但置亂要用逆矩陣A_inv [2 -1; -1 1]且輪數(shù)按k遞減。A_inv [2 -1; -1 1]; de_xor received_gauss; % 第一步異或逆操作和加密完全相同 de_xor(key_bin 1) 1 - de_xor(key_bin 1); % 第二步反向Arnold置亂 for t k:-1:1 temp de_xor; for i 1:M for j 1:N oi mod(A_inv(1,1)*(i-1) A_inv(1,2)*(j-1), M) 1; oj mod(A_inv(2,1)*(i-1) A_inv(2,2)*(j-1), N) 1; temp(oi, oj) de_xor(i, j); end end de_xor temp; end de_gauss im2uint8(de_xor);邏輯說(shuō)明異或的逆操作就是再次異或1 - (1 - x) x所以第一步不需要區(qū)分加密還是解密。反置亂的關(guān)鍵在于逆矩陣。Arnold變換矩陣[1 1; 1 2]的行列式為1逆矩陣為[2 -1; -1 1]。使用逆矩陣做映射輪數(shù)必須從k遞減到1否則就變成繼續(xù)正向置亂。這里oi/oj是原始坐標(biāo)de_xor(i,j)是當(dāng)前輪密文坐標(biāo)上的像素所以賦值方向是temp(oi, oj) de_xor(i, j)正好與加密相反。同理對(duì)received_salt執(zhí)行完全相同的解密流程得到de_salt。需要注意的是椒鹽噪聲被置為0或1的像素在解密異或后可能仍然極值中值濾波可以用于還原。常見(jiàn)做法是在反置亂前對(duì)received_salt先做一次medfilt2received_salt_filtered medfilt2(received_salt, [3 3]);參數(shù)說(shuō)明medfilt2的第二個(gè)參數(shù)是濾波窗口[3 3]表示3x3中值濾波。這個(gè)操作只對(duì)脈沖噪聲有效對(duì)高斯噪聲效果有限所以只對(duì)椒鹽噪聲通道做。4.3 解密質(zhì)量量化PSNR和SSIM課程設(shè)計(jì)報(bào)告里光有圖像不夠必須量化對(duì)比。PSNR基于均方誤差SSIM衡量結(jié)構(gòu)相似性。常用的評(píng)估代碼orig_uint8 im2uint8(orig); psnr_gauss psnr(de_gauss, orig_uint8); ssim_gauss ssim(de_gauss, orig_uint8); fprintf(高斯信道: PSNR%.2fdB, SSIM%.4f\n, psnr_gauss, ssim_gauss);參數(shù)說(shuō)明psnr和ssim函數(shù)都在MATLAB圖像處理工具箱中。PSNR高于30dB通常視覺(jué)可接受SSIM越接近1越相似。因?yàn)榛煦缦到y(tǒng)的擴(kuò)散效應(yīng)高斯信道下即使信噪比有20dB解密圖的PSNR也可能只有20dB左右這說(shuō)明一個(gè)小幅度噪聲被置亂運(yùn)算放大。答辯時(shí)一定要解釋這一點(diǎn)否則老師會(huì)質(zhì)疑為什么加了噪聲后圖像質(zhì)量下降這么嚴(yán)重。4.4 密鑰不匹配時(shí)會(huì)發(fā)生什么這是最容易出錯(cuò)的坑接收端如果持有不同的x0哪怕只差0.0001解出來(lái)的圖像也是雪花噪聲。x0_error 0.43790; % 錯(cuò)誤密鑰 % 生成錯(cuò)誤序列并解密代碼與4.2相同僅更換x0 % 可看到輸出圖像完全無(wú)法辨識(shí)邏輯說(shuō)明Logistic映射是確定性混沌系統(tǒng)初值差異在迭代過(guò)程中會(huì)被指數(shù)放大。兩張用接近初值生成的密鑰序列在位級(jí)別上相關(guān)系數(shù)接近0.5這意味著異或解密基本等效于隨機(jī)翻轉(zhuǎn)。這也說(shuō)明了為什么加密系統(tǒng)對(duì)錯(cuò)誤密鑰不提供任何部分信息。密鑰敏感度的數(shù)值驗(yàn)證在5.3節(jié)單獨(dú)給出。5. 從課程設(shè)計(jì)到工程化矩陣加速、界面封裝與密鑰自檢5.1 用矩陣操作替代雙重循環(huán)重新封裝置亂函數(shù)前面3.3的置亂循環(huán)在256x256的圖上已經(jīng)要跑一陣換到512x512的圖會(huì)讓人懷疑程序死循環(huán)。MATLAB的強(qiáng)項(xiàng)是矩陣運(yùn)算可以把坐標(biāo)計(jì)算向量化function scr arnold_fast(img, k) [M, N] size(img); A [1 1; 1 2]; [X, Y] meshgrid(1:N, 1:M); % X每行1:NY每列1:M for t 1:k Xn mod(A(1,1)*(X-1) A(1,2)*(Y-1), M) 1; Yn mod(A(2,1)*(X-1) A(2,2)*(Y-1), N) 1; lin_old sub2ind([M, N], Y, X); lin_new sub2ind([M, N], Yn, Xn); tmp zeros(M, N); tmp(lin_new) img(lin_old); img tmp; end scr img; end邏輯說(shuō)明meshgrid生成所有像素的行列坐標(biāo)Xn/Yn是每個(gè)像素經(jīng)過(guò)正向變換后的新坐標(biāo)。lin_old是舊坐標(biāo)的線性索引lin_new是新坐標(biāo)的線性索引。tmp(lin_new) img(lin_old)將舊圖像每個(gè)像素移動(dòng)到新位置。Arnold變換是雙射不會(huì)出現(xiàn)兩個(gè)舊像素映射到同一個(gè)新位置的問(wèn)題。相比逐像素循環(huán)這種寫(xiě)法去掉了最內(nèi)層坐標(biāo)計(jì)算時(shí)間開(kāi)銷(xiāo)主要承擔(dān)在img(lin_old)索引賦值上。實(shí)戰(zhàn)中256x256的圖像30輪置亂性能能提升20倍左右。圖像尺寸雙循環(huán)耗時(shí)參考矩陣索引耗時(shí)參考256x256約1.2s約0.06s512x512約5.5s約0.3s提示這里的耗時(shí)會(huì)隨MATLAB版本和電腦配置浮動(dòng)重點(diǎn)在數(shù)量級(jí)差異。課程設(shè)計(jì)報(bào)告里給出這個(gè)對(duì)比能體現(xiàn)你確實(shí)理解MATLAB的編程風(fēng)格。5.2 untitled1.fig界面兼容性與App Designer改造untitled1.fig是用GUIDE創(chuàng)建的界面。在R2017b之前的MATLAB版本雙擊就能打開(kāi)。R2018b及以上版本雖然還能運(yùn)行GUIDE生成的fig但官方已不再維護(hù)GUIDE推薦改用App Designer。打開(kāi)fig的方法openfig(untitled1.fig);注意如果打開(kāi)后控件錯(cuò)位是fig版本與當(dāng)前MATLAB的GUIDE布局引擎不兼容。我一般會(huì)在untitled1.m里保留參數(shù)輸入提示然后把界面邏輯分成兩個(gè)回調(diào)一個(gè)執(zhí)行加密一個(gè)執(zhí)行解密。界面本身并不復(fù)雜項(xiàng)目重點(diǎn)在加解密流程所以用App Designer重建一個(gè)相同界面也不費(fèi)事。保留fig文件的目的是讓評(píng)審老師能夠直接看到交互界面而不是黑框命令。5.3 密鑰敏感性自檢與答辯演示技巧密鑰敏感性是評(píng)分時(shí)最可能被問(wèn)的點(diǎn)可以用一行腳本驗(yàn)證x0_wrong x0 1e-5; % 僅改變1e-5 seq_wrong gen_logistic(x0_wrong, mu, M*N); diff_rate mean(key_bin ~ reshape(seq_wrong 0.5, M, N)); fprintf(密鑰差異導(dǎo)致的比特差異率: %.4f\n, diff_rate);參數(shù)說(shuō)明如果diff_rate接近0.5說(shuō)明初值微小變化已經(jīng)讓密鑰流完全失去相關(guān)性這是混沌加密的正確表現(xiàn)。若diff_rate明顯小于0.4就要檢查L(zhǎng)ogistic映射是否進(jìn)入了周期窗口可以嘗試換一個(gè)μ值。答辯演示時(shí)建議準(zhǔn)備三張圖無(wú)噪聲解密圖、高斯噪聲解密圖、椒鹽噪聲解密圖并標(biāo)注各自的PSNR。再配合密鑰不匹配時(shí)輸出的雪花圖證明系統(tǒng)對(duì)密鑰敏感。把部署說(shuō)明文檔里的運(yùn)行步驟截圖放進(jìn)PPT說(shuō)明你不僅會(huì)跑代碼還理解項(xiàng)目資料的結(jié)構(gòu)。這個(gè)收尾雖然簡(jiǎn)短但可以讓評(píng)審老師快速抓住項(xiàng)目亮點(diǎn)拿高分也就不意外了。本文還有配套的精品資源點(diǎn)擊獲取