戰(zhàn):Arnold置亂與Logistic混沌混合算法詳解)
簡介本資源是一套面向Matlab初學(xué)者與圖像安全方向入門研究者的圖像加密實(shí)踐工具包聚焦混沌理論、DNA編碼、光學(xué)變換等前沿加密方法的代碼實(shí)現(xiàn)與可視化驗(yàn)證。資源共42個(gè)文件包含23個(gè)核心.m函數(shù)如FHCCS混沌系統(tǒng)建模、Arnold置亂、小波分解加密、雙隨機(jī)相位編碼等、6個(gè)備份文件.zbak、6個(gè)說明類文本含算法原理與參數(shù)配置、2幅標(biāo)準(zhǔn)測試圖像BMP/JPG格式及README文檔整體壓縮包大小為10.69MB。已有25人學(xué)習(xí)下載適用于課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)或科研原型快速驗(yàn)證。用戶可直接運(yùn)行main.m主程序一鍵完成多種加密算法對比實(shí)驗(yàn)獲得置亂圖、密文圖、解密還原圖及關(guān)鍵指標(biāo)曲線所有函數(shù)模塊解耦清晰、注釋完整支持替換任意圖像數(shù)據(jù)并適配Matlab 2019b環(huán)境附帶常見異常處理提示與作者技術(shù)支持通道。 最近好幾個(gè)學(xué)生找我聊Matlab圖像加密的大作業(yè)我翻了下他們寫的初版代碼發(fā)現(xiàn)大多數(shù)問題根本不出在加密算法本身而是卡在圖像數(shù)據(jù)讀取、類型轉(zhuǎn)換、坐標(biāo)索引這些最基礎(chǔ)的地方。這篇文章我把Matlab里幾種最常用的圖像加密方法一次性講透——包括Arnold貓臉置亂、Logistic混沌序列擴(kuò)散、以及兩者結(jié)合的混合加密所有代碼都能直接復(fù)制跑通還附帶安全性能的量化驗(yàn)證腳本。無論你是做大作業(yè)、課程設(shè)計(jì)還是打算往圖像密碼學(xué)方向發(fā)論文這篇都值得存下來反復(fù)看。1. 圖像加密到底在加密什么為什么AES不能直接套用在圖片上很多人上來就問“為什么圖像加密不用AES”我換個(gè)角度解釋AES當(dāng)然可以加密圖像把一個(gè)灰度圖展開成一維字節(jié)流按128位分組喂進(jìn)去出來就是一堆亮瞎眼的噪聲數(shù)據(jù)。但你很快會撞到幾個(gè)實(shí)際問題——圖像數(shù)據(jù)量太大一張512乘512的灰度圖就有26萬個(gè)字節(jié)AES分組加密循環(huán)模式跑下來相當(dāng)慢更重要的是AES把圖像當(dāng)成普通二進(jìn)制流處理完全沒有利用圖像本身的結(jié)構(gòu)特征解密后哪怕一個(gè)比特錯(cuò)誤整塊都會崩潰。1.1 圖像數(shù)據(jù)與文本數(shù)據(jù)的本質(zhì)差異圖像和文本的區(qū)別直接決定加密策略完全不同。文本的冗余度低一個(gè)字節(jié)錯(cuò)了語義可能全變圖像恰恰相反相鄰像素之間的冗余度極高你要找一張沒有局部相關(guān)性的自然圖像幾乎不可能。一張純色天空的照片水平方向相鄰像素的灰度值相關(guān)系數(shù)能到0.98以上這在密碼學(xué)里叫明文冗余。攻擊者如果拿到加密前后的圖像完全可以通過統(tǒng)計(jì)像素分布、相關(guān)性分析來推測密鑰結(jié)構(gòu)。所以圖像加密的核心思想一個(gè)是置亂把像素的位置打亂讓圖像變得像雪花一樣不辨內(nèi)容另一個(gè)是擴(kuò)散改變像素的灰度值讓明文哪怕只改一個(gè)像素密文也會徹底改變。這兩種思想對應(yīng)兩類完全不同的算法實(shí)操中往往組合起來用。1.2 判斷一套圖像加密方案好不好的四個(gè)維度評價(jià)方法好壞別只盯著“看起來像不像噪點(diǎn)”。我一般看四個(gè)維度第一是密鑰空間至少要達(dá)到2的100次方量級否則暴力破解能試出來第二是鄰近像素相關(guān)性加密后水平、垂直、對角線方向的相關(guān)系數(shù)應(yīng)該趨近于0第三是信息熵8位灰度圖的信息熵理論最大是8加密后越接近8說明灰度分布越均勻第四是密鑰敏感性密鑰哪怕差1e-15解密結(jié)果也應(yīng)該完全不同。這套評價(jià)框架后面會給出具體的Matlab實(shí)現(xiàn)。2. 動手寫加密之前Matlab圖像數(shù)據(jù)的讀取、類型與預(yù)處理這一步看似基礎(chǔ)但實(shí)際上三個(gè)最常見的報(bào)錯(cuò)都發(fā)生在這一階段。先說第一個(gè)坑Matlab的imread讀進(jìn)來的圖像彩色圖是H乘W乘3的uint8數(shù)組灰度圖是H乘W的uint8數(shù)組很多人拿著彩色圖直接跑加密函數(shù)維度對不上報(bào)錯(cuò)Subscripted assignment dimension mismatch。2.1 灰度轉(zhuǎn)換與正方形化的取舍加密算法絕大多數(shù)是針對灰度圖的RGB圖像可以當(dāng)成三個(gè)獨(dú)立的灰度通道分別處理但這樣計(jì)算量直接翻三倍。我的建議是先把彩色圖轉(zhuǎn)成灰度A imread(lena.png); if size(A, 3) 3 A rgb2gray(A); end接下來是正方形化。Arnold變換的理論基礎(chǔ)本身就是基于方陣的非方圖像強(qiáng)行套用會產(chǎn)生坐標(biāo)映射錯(cuò)位。兩種做法一是直接裁剪到正方形區(qū)域簡單但會丟失信息二是用padarray補(bǔ)零到正方形解密之后再把補(bǔ)的區(qū)域裁掉信息無損失。我個(gè)人更推薦第二種[H, W] size(A); N max(H, W); A_pad padarray(A, [N - H, N - W], post);如果只是做算法演示不想折騰也可以直接imresize到256乘256但要記住解密得到的尺寸和你原始圖像不一樣。2.2 圖像數(shù)據(jù)類型的坑uint8與double切換這是新手踩得最狠的坑。Matlab圖像的像素值通常是uint8范圍0到255。但加密算法里經(jīng)常要算mod、floor、浮點(diǎn)運(yùn)算這些操作在uint8下會報(bào)錯(cuò)或溢出。我見過有人把uint8圖像直接做double除法結(jié)果圖像變得一片灰白還以為是加密成功——“雖然看不清了但確實(shí)加密了”其實(shí)那只是數(shù)據(jù)溢出。處理原則是做位運(yùn)算bitxor、bitshift保持在uint8類型做數(shù)學(xué)變換時(shí)用double顯示圖像時(shí)用imshow它會自動處理double類型下的0到1范圍。如果你把uint8轉(zhuǎn)成double需要?dú)w一化到0到1還是保留0到255前后邏輯要一致。比如Logistic混沌序列加密我建議全程走uint8加bitxor避免類型轉(zhuǎn)換引發(fā)精度問題。2.3 加密結(jié)果保存格式直接影響能否解密加密完的圖像要存到磁盤格式選不對解密直接失敗。PNG和BMP是無損壓縮加密后的數(shù)據(jù)能完好還原JPEG是有損壓縮壓縮過程會改像素值解密出來的圖像邊緣全是色斑而且失真會隨壓縮質(zhì)量下降加劇。這就相當(dāng)于你加密了“一堆字節(jié)”結(jié)果保存時(shí)被壓縮算法改了內(nèi)容解密自然對不上。正確寫法是imwrite(cipher, encrypted.png);另外密鑰一定要單獨(dú)保存。代碼里隨手寫的x0和mu解密時(shí)差一個(gè)位都還原不出來。推薦用mat文件保存因?yàn)楦↑c(diǎn)數(shù)的精度在文本文件里很容易丟失save(my_key.mat, x0, mu, a, b, iter);3. 第一種方法Arnold貓臉變換實(shí)現(xiàn)圖像置亂Arnold變換又叫貓臉變換最早是Arnold在研究遍歷理論時(shí)提出來的因?yàn)閷D片做迭代變換時(shí)會逐漸把圖像“揉碎”成看似隨機(jī)分布的噪點(diǎn)而貓的照片效果最直觀而得名。它的公式非常簡潔就是一個(gè)二維坐標(biāo)的線性映射。3.1 Arnold變換的數(shù)學(xué)原理經(jīng)典Arnold變換的離散形式是這樣的x (x ay) mod N y (bx (a*b 1)*y) mod N這里的(x, y)是原圖像的像素坐標(biāo)對應(yīng)矩陣中的列和行N是正方形圖像的邊長a和b是控制參數(shù)。對每個(gè)像素點(diǎn)做這個(gè)變換后它會被搬運(yùn)到一個(gè)新的位置。迭代一次看到的是圖案被壓扁拉長迭代幾次就會徹底變成噪聲圖。這個(gè)變換有個(gè)很有趣的性質(zhì)周期性和可逆性。因?yàn)樽儞Q矩陣的行列式等于1它是一個(gè)保面積的線性變換在有限整數(shù)環(huán)上做迭代經(jīng)過有限次后一定能回到原圖。256乘256的圖取a1、b1時(shí)周期是192。這意味著你可以用“繼續(xù)迭代”來解密而不需要求逆矩陣。3.2 從零實(shí)現(xiàn)Arnold置亂先給一個(gè)循環(huán)版本的實(shí)現(xiàn)邏輯清晰適合理解原理function out arnold_loop(img, a, b, iter) [H, W] size(img); out img; for k 1:iter tmp zeros(H, W); for y 1:H for x 1:W nx mod(x - 1 a * (y - 1), W) 1; ny mod(b * (x - 1) (a * b 1) * (y - 1), H) 1; tmp(ny, nx) out(y, x); end end out tmp; end end注意這里為什么用0基坐標(biāo)Arnold公式是從0計(jì)數(shù)的而Matlab數(shù)組索引從1開始所以要做兩次偏移先減1參與運(yùn)算結(jié)果再加1。很多人的代碼出問題都出在忘記這個(gè)偏移上。mod函數(shù)結(jié)果范圍是0到N減1所以直接加1就是合法索引。這個(gè)雙層for循環(huán)在256乘256的圖像上大概要跑幾秒迭代10次就是幾十秒體驗(yàn)很差。好在坐標(biāo)映射是固定的可以一次性把所有坐標(biāo)索引算好循環(huán)里只做賦值function out arnold_vec(img, a, b, iter) [H, W] size(img); [Y, X] ndgrid(1:H, 1:W); nx mod(X - 1 a * (Y - 1), W) 1; ny mod(b * (X - 1) (a * b 1) * (Y - 1), H) 1; srcIdx sub2ind([H, W], Y(:), X(:)); dstIdx sub2ind([H, W], ny(:), nx(:)); out img; for k 1:iter tmp zeros(H, W); tmp(dstIdx) out(srcIdx); out tmp; end end這個(gè)版本比循環(huán)快了大概兩個(gè)數(shù)量級。sub2ind把二維坐標(biāo)展平成一維索引dstIdx里的第i個(gè)元素值就是srcIdx第i個(gè)源坐標(biāo)應(yīng)該被移動到的目標(biāo)位置。原理和循環(huán)版完全一致但避免了逐像素解釋執(zhí)行的開銷。3.3 兩種解密方式周期法與逆映射法第一種是利用Arnold的周期性。以256乘256圖像為例用a1、b1周期T192你的加密迭代了iter次那解密就繼續(xù)迭代T減iter次總迭代數(shù)達(dá)到周期自動還原。這個(gè)方法的缺點(diǎn)是必須提前知道周期計(jì)算周期還要額外寫一段腳本。更通用的是直接構(gòu)造逆變換。變換矩陣的逆也非常簡單因?yàn)樾辛惺胶銥?所以逆映射為x ((ab 1)x - ay) mod N y (-bx y) mod N代碼實(shí)現(xiàn)function out arnold_inv(img, a, b, iter) [H, W] size(img); [Y, X] ndgrid(1:H, 1:W); nx mod(X - 1 a * (Y - 1), W) 1; ny mod(b * (X - 1) (a * b 1) * (Y - 1), H) 1; srcIdx sub2ind([H, W], Y(:), X(:)); dstIdx sub2ind([H, W], ny(:), nx(:)); out img; for k 1:iter tmp zeros(H, W); tmp(srcIdx) out(dstIdx); out tmp; end end你可能會問加密和解密代碼幾乎一樣只是tmp(srcIdx)和tmp(dstIdx)換了個(gè)位置對因?yàn)檎儞Q負(fù)責(zé)把原圖坐標(biāo)映射到目標(biāo)坐標(biāo)逆變換就是反著取像素。這個(gè)對稱性也是Arnold變換的經(jīng)典魅力之一。解密時(shí)調(diào)用arnold_inv(cipher, a, b, iter)注意傳入的迭代次數(shù)必須和加密時(shí)一樣。4. 第二種方法Logistic混沌序列實(shí)現(xiàn)像素值擴(kuò)散Arnold置亂只打亂了像素位置像素灰度值本身沒變。攻擊者只要統(tǒng)計(jì)直方圖就能看出明文圖像的灰度分布特征進(jìn)而做統(tǒng)計(jì)分析。Logistic混沌映射解決的是另一個(gè)維度的問題——把像素值本身徹底改掉讓密文的統(tǒng)計(jì)特征和明文無關(guān)。4.1 混沌系統(tǒng)與Logistic映射混沌系統(tǒng)的特點(diǎn)是初值極微小變化迭代結(jié)果會在指數(shù)級時(shí)間內(nèi)分道揚(yáng)鑣。Logistic映射是最簡單的一維混沌系統(tǒng)x(n1) mu * x(n) * (1 - x(n))x的取值范圍在0到1之間mu是控制參數(shù)。當(dāng)mu在3.57到4之間時(shí)系統(tǒng)進(jìn)入混沌狀態(tài)序列不收斂、不周期、對初值極其敏感。實(shí)際使用時(shí)mu通常取3.9999甚至更接近4保證充分混沌。用生活化類比這種“蝴蝶效應(yīng)”就像你站在兩座山的分水嶺上腳下差一毫米雨水就流進(jìn)完全不同的流域?;煦缧蛄姓抢眠@種極端不穩(wěn)定性來構(gòu)造密鑰流。4.2 混沌序列生成與加解密實(shí)現(xiàn)加密流程分三步先用密鑰初值x0和參數(shù)mu迭代生成一條足夠長的混沌序列然后把序列量化成0到255的整數(shù)流按圖像尺寸重排成噪聲矩陣最后把噪聲矩陣和明文圖像做逐像素異或。關(guān)鍵細(xì)節(jié)是混沌序列的前幾百個(gè)點(diǎn)不要直接用。因?yàn)槌踔祒0雖然是隨機(jī)選的但系統(tǒng)從初值進(jìn)入混沌狀態(tài)需要一個(gè)過渡過程這段瞬態(tài)序列的隨機(jī)性不夠好。常規(guī)做法是跳過前500個(gè)點(diǎn)再取用function [cipher, x0, mu] logistic_encrypt(img, x0, mu) [H, W] size(img); N H * W; x zeros(1, N 500); x(1) x0; for i 1:N 499 x(i 1) mu * x(i) * (1 - x(i)); end seq x(501:N 500); noise uint8(mod(floor(seq * 256), 256)); noise reshape(noise, H, W); cipher bitxor(img, noise); end解密函數(shù)幾乎一模一樣因?yàn)楫惢蜻\(yùn)算本身是對稱的對同一個(gè)噪聲矩陣做兩次異或就回到原始圖像。所以解密就是再把密文和同樣的噪聲異或一次。但這里有個(gè)隱藏陷阱生成噪聲矩陣依賴完整的混沌序列如果圖像尺寸變了N就變了生成的噪聲矩陣對不上。密鑰參數(shù)x0和mu必須和加密時(shí)完全一致并且圖像尺寸不能變。4.3 為什么混沌系統(tǒng)適合做密鑰傳統(tǒng)偽隨機(jī)數(shù)生成器比如rand雖然也能產(chǎn)生序列但它是基于種子做確定性計(jì)算的周期有限且序列之間存在統(tǒng)計(jì)相關(guān)性用在加密上不夠安全?;煦缧蛄械男再|(zhì)更接近理想隨機(jī)序列遍歷性好、自相關(guān)性接近沖激函數(shù)、互相關(guān)性接近零而且對初值極度敏感。另外一個(gè)實(shí)用原因是密鑰空間大。x0是一個(gè)雙精度浮點(diǎn)數(shù)取值范圍0到1精度大約在1e-16量級相當(dāng)于提供約2的52次方的密鑰空間mu同樣可以提供這么大的空間。兩者組合下來暴力破解的計(jì)算量已經(jīng)超出實(shí)際可行范圍。對課程設(shè)計(jì)和大部分工程應(yīng)用來說這個(gè)安全強(qiáng)度已經(jīng)夠用了。5. 第三種方法置亂加擴(kuò)散的混合加密與完整解密鏈路單獨(dú)用Arnold置亂直方圖不變統(tǒng)計(jì)攻擊一下就能拆穿單獨(dú)用Logistic擴(kuò)散雖然像素值變了但相鄰像素的關(guān)系會被保留一部分而且明文冗余依然存在。真正的做法是“置亂打亂位置、擴(kuò)散改變數(shù)值”兩者配合才能達(dá)到現(xiàn)代密碼學(xué)里“混淆”和“擴(kuò)散”的理想效果。5.1 混淆與擴(kuò)散的組合策略實(shí)際加密過程中先做置亂還是先做擴(kuò)散效果差別不大但推薦先置亂再擴(kuò)散。理由是Arnold置亂不改變像素值如果先擴(kuò)散再置亂相當(dāng)于把一個(gè)“已經(jīng)變成噪聲”的圖再打亂位置多此一舉先置亂再擴(kuò)散置亂復(fù)雜度能擴(kuò)散到整幅圖的像素上明文任何一個(gè)位置的改變都會影響到后續(xù)所有位置。組合加密的流程是用arnold_vec對明文圖做iter次置亂把置亂結(jié)果輸入logistic_encrypt做像素級擴(kuò)散得到最終密文圖解密反過來用同樣的x0和mu對密文做logistic解密也就是異或回去用arnold_inv對結(jié)果做iter次逆置亂5.2 混合加解密完整代碼% 加密 A imread(lena.png); if size(A, 3) 3 A rgb2gray(A); end [J, K] size(A); N max(J, K); A padarray(A, [N - J, N - K], post); a 1; b 1; iter 10; x0 0.37892345; mu 3.9999; scrambled arnold_vec(A, a, b, iter); [cipher, ~, ~] logistic_encrypt(scrambled, x0, mu); imwrite(cipher, hybrid_encrypted.png); % 解密 cipher imread(hybrid_encrypted.png); [descrambled, ~, ~] logistic_encrypt(cipher, x0, mu); % 或者寫一個(gè)logistic_decrypt plain arnold_inv(descrambled, a, b, iter); plain plain(1:J, 1:K); % 裁剪掉pad的部分 figure; subplot(2, 2, 1); imshow(A); title(原始圖像); subplot(2, 2, 2); imshow(scrambled); title(Arnold置亂后); subplot(2, 2, 3); imshow(cipher); title(混合加密后); subplot(2, 2, 4); imshow(plain); title(解密還原);這段代碼跑完你會看到置亂圖已經(jīng)看不出原圖輪廓混合加密后連灰度直方圖的特征都沒了解密圖還原度幾乎無損。注意解密后的plain裁剪因?yàn)榧用芮皃adarray補(bǔ)了零裁剪后才是原始尺寸。6. 加密效果好不好五個(gè)量化指標(biāo)教你用數(shù)據(jù)驗(yàn)證“肉眼看著挺亂”不能作為加密成功的證據(jù)尤其寫課程設(shè)計(jì)或論文時(shí)需要用量化指標(biāo)證明你的方案有效。下面這些腳本可以直接打到自己工程里。6.1 灰度直方圖與信息熵直方圖直接反映像素灰度分布。明文圖直方圖有明顯的山峰狀起伏加密后應(yīng)該變得平緩均勻。用Matlab自帶的imhist就能看figure; subplot(1, 2, 1); imhist(A); title(明文直方圖); subplot(1, 2, 2); imhist(cipher); title(密文直方圖);信息熵可以量化“均勻程度”。8位灰度圖的信息熵計(jì)算公式是負(fù)的p_i乘log2(p_i)累加p_i是灰度值i出現(xiàn)的概率理想狀態(tài)下接近8function e image_entropy(img) counts imhist(img); p counts / sum(counts); p(p 0) 1e-12; e -sum(p .* log2(p)); end實(shí)際測試中自然圖像加密后信息熵一般能做到7.997以上如果你的密文熵低于7.99說明灰度分布不夠均勻擴(kuò)散效果有改進(jìn)空間。6.2 相鄰像素相關(guān)性分析自然圖像的相鄰像素相關(guān)性極高加密后應(yīng)該接近0。通過相關(guān)系數(shù)來檢驗(yàn)系數(shù)越接近0置換效果越好function r neighbor_corr(img) img double(img); r_horiz corr2(img(:, 1:end-1), img(:, 2:end)); r_vert corr2(img(1:end-1, :), img(2:end, :)); r_diag corr2(img(1:end-1, 1:end-1), img(2:end, 2:end)); r [r_horiz, r_vert, r_diag]; fprintf(水平: %.4f, 垂直: %.4f, 對角: %.4f\n, r(1), r(2), r(3)); end明文圖像這三個(gè)值通常在0.9以上加密后三個(gè)方向都應(yīng)該在0.01以下。如果某個(gè)方向的相關(guān)性還很高說明置亂沒有充分打亂該方向的像素順序可以增加Arnold迭代次數(shù)或換用更復(fù)雜的置亂方式。6.3 密鑰敏感性與抗差分攻擊分析密鑰敏感性測試是驗(yàn)證“差一個(gè)bit都解不開”的神器。做法很簡單用正確密鑰解密一次再用一個(gè)極小擾動的密鑰比如x0加1e-12解密一次然后統(tǒng)計(jì)兩個(gè)結(jié)果的差異率[plain_correct, ~, ~] logistic_encrypt(cipher, x0, mu); plain_correct arnold_inv(plain_correct, a, b, iter); [plain_wrong, ~, ~] logistic_encrypt(cipher, x0 1e-12, mu); plain_wrong arnold_inv(plain_wrong, a, b, iter); diff_rate sum(plain_correct(:) ~ plain_wrong(:)) / numel(plain_correct); fprintf(密鑰擾動解密差異率: %.2f%%\n, diff_rate * 100);理想結(jié)果應(yīng)該在99%以上也就是說錯(cuò)一位密鑰解密出來的圖像幾乎每個(gè)像素都不同。如果差異率只有百分之幾密鑰敏感度不夠有被相關(guān)攻擊利用的風(fēng)險(xiǎn)。對于抗差分攻擊還有一個(gè)NPCR像素變化率指標(biāo)正常做法是隨機(jī)改明文的一個(gè)像素加密得到密文1原明文加密得到密文2統(tǒng)計(jì)兩個(gè)密文間不同像素的比例。比例越高說明算法對明文變化的擴(kuò)散能力越好理想值約99.6%。UACI統(tǒng)一平均變化強(qiáng)度則衡量變化的平均幅度理想值約33.4%。這兩個(gè)指標(biāo)配合使用能證明算法對選擇明文攻擊有較強(qiáng)抵抗力。7. 實(shí)戰(zhàn)中容易踩的坑與性能優(yōu)化思路這一節(jié)把我在調(diào)試過程中真正撞過的問題和解決辦法列出來省得你們再走一遍彎路。7.1 常見報(bào)錯(cuò)與根因?qū)φ毡韴?bào)錯(cuò)現(xiàn)象根本原因解決辦法Subscript indices must either be real positive integersArnold坐標(biāo)變換后沒有加1mod結(jié)果記得1先減1參與運(yùn)算Inputs must be the same size or one input must be scalarbitxor兩個(gè)操作數(shù)尺寸不一致檢查reshape后的noise矩陣是否和圖像維度相同Invalid data type, expected uint8bitxor的輸入是double用uint8()轉(zhuǎn)換后參與運(yùn)算解密圖像有黑邊加密前padarray補(bǔ)零解密后沒裁剪plain(1:J, 1:K)裁掉補(bǔ)充區(qū)域保存為jpg后解密圖像有色斑有損壓縮修改了像素值改用imwrite(cipher, xxx.png)7.2 大圖的性能問題256乘256的灰度圖直接跑代碼完全沒有壓力但如果你拿一張1024乘1024甚至更高分辨率的圖問題就來了。主要瓶頸是Arnold變換的坐標(biāo)索引即使是向量化版本每次迭代也要建立全尺寸的索引數(shù)組并做多次內(nèi)存分配。我的優(yōu)化建議有三個(gè)第一預(yù)計(jì)算坐標(biāo)索引。arnold_vec里的映射矩陣在一次解密過程中是不變的你可以在腳本開頭算好srcIdx和dstIdx把它放在結(jié)構(gòu)體里傳給循環(huán)用而不是每次調(diào)用arnold都重新算一遍。第二分塊處理。如果加密超大尺寸圖像導(dǎo)致內(nèi)存不足可以先用imresize縮小到合理尺寸再加密但要清楚這是以分辨率換速度不是所有場景都適用。第三數(shù)據(jù)類型優(yōu)化。圖像矩陣在加密過程中保持uint8類型能用位運(yùn)算就用位運(yùn)算避免無謂的double轉(zhuǎn)換。double矩陣占8字節(jié)uint8只占1字節(jié)大圖內(nèi)存占用差距非常大。7.3 密鑰丟失與工程化建議加密容易解密要命。很多人把密鑰寫死在腳本里跑完就忘下次解密時(shí)要么找不回來要么記錯(cuò)一位小數(shù)。我的做法是寫一個(gè)密鑰結(jié)構(gòu)體加密時(shí)自動保存為mat文件key_info.method arnold_logistic_hybrid; key_info.a a; key_info.b b; key_info.iter iter; key_info.x0 x0; key_info.mu mu; key_info.image_size [J, K]; save(key.mat, key_info);有了這個(gè)文件解密腳本就能自動讀取密鑰參數(shù)還能判斷圖像尺寸是否正確。工程上這是個(gè)好習(xí)慣防止密鑰和圖像分開之后對不上號。最后想說的圖像加密這個(gè)方向代碼本身并不復(fù)雜難的是理解每個(gè)環(huán)節(jié)到底在解決什么問題。Arnold負(fù)責(zé)破壞位置關(guān)系Logistic負(fù)責(zé)破壞灰度關(guān)系兩者組合起來才能達(dá)到現(xiàn)代密碼學(xué)對混淆和擴(kuò)散的基本要求。我強(qiáng)烈建議你拿到代碼后分別跑一遍純置亂、純擴(kuò)散和混合加密再用第6節(jié)的指標(biāo)對比三種方案的數(shù)據(jù)差異——這種直觀感受比任何教科書解釋都管用。如果你后續(xù)打算往更深的方向走可以考慮在混合加密基礎(chǔ)上加入DNA編碼、分?jǐn)?shù)階混沌、或者結(jié)合壓縮感知的“加密同時(shí)壓縮”方案。Matlab做原型驗(yàn)證非常方便但生產(chǎn)環(huán)境里記得把核心加解密函數(shù)移植到Python或C。先從這篇文章里的代碼跑起來你會發(fā)現(xiàn)圖像加密的門檻沒有想象中那么高。本文還有配套的精品資源點(diǎn)擊獲取