摘要
一種基於混沌Logistic加密算法的圖片加密與還原的方法,並利用Lena圖和Baboon圖來驗證這種加密算法的加密效果。為了能夠體現該算法在圖片信息加密的效果,本文還采用了普通行列置亂加密算法和像素點的RGB的值的縮放算法這兩種算法對相同的圖片的圖片進行處理,利用matlab通過顯示加密過后的圖片以及直方圖分析可以很直觀的發現混沌Logistic加密算法對圖片信息加密的效果更好,並且很好地隱藏了原始圖像的統計特性,能夠有效地抵御基於圖像像素值的統計攻擊,達到了圖像加密的效果。
混沌Logistic映射的理論
混沌的基本概念
1975年,美國數學家約克和美籍華人李天岩發表了《周期3意味着混沌》的文章,首次提出了“混沌”—詞,闡述了混沌的數學定義,對混沌學的發展具有重大意義。自此以后,混沌研究開始蓬勃發展。
混沌是指在確定性動力學系統中,由於對初值敏感而表現出的類似隨機的、不可預測的運動。混沌是確定的非線性系統中出現的內在隨機性現象,其變化並非隨機確貌似隨機。
Logistic映射方程
Logistic映射是一個典型的非線性的迭代方程,如式所示:
稱為Logistic映射的控制參數,對任意的k有,其中k為迭代時間步。Logistic映射的動態行為與控制參數u密切相關 ,對於不同的u值系統將呈現不同的特性(即當k趨於無窮大,xk的變化情況)。其中Logistic映射有兩個主要的參數,一個是初值x0,一個是系統參數μ,研究表明,當 0<μ<=3.5699456時,Logistic呈現出周期性;而當映射方程滿足0<x0<1和3.5699456<μ<=4這兩個條件時,Logistic映射處於混沌狀態 ,即一種無序的、不可預測的、混亂的、摸不到頭、摸不到尾的狀態。對給定的初始值x0,生成的序列是非周期性、非收斂以及對初始條件敏感的。
有界性
混沌是有界的,它的運動軌線始終局限於一個確定的區域,這個區域稱為混沌吸引域。由圖 所示,無論控制參數μ怎么變,迭代值xn始終在(0,1)之間。
不同控制參數μ下的Logistic分岔圖
混沌Logistic映射與其他加密算法介紹
普通行列置亂加密算法
普通置亂加密算法的流程
將讀入的水印圖片,先獲取圖片的大小,得到原始圖片矩陣,首先隨機打亂各行,輸出打亂后的矩陣,再將這個矩陣隨機打亂各列,最后圖像成功加密,顯示加密圖像。算法流程框圖如圖:
算法分析
s = size(handles.img);
% 將picture分為3列,每列768/3=256個元素
%%% 隨機打亂各行進行加密
% 不放回的均勻分布的從1到s(1)取整數,個數為s(1)抽樣
r = randsample(s(1), s(1)); % r為256*1的矩陣,得到256個不相同的數
RGBS = handles.img(r, :, :); % 得到一個256*256的圖像矩陣
%%% 隨機打亂各列進行加密
c = randsample(s(2), s(2)); % c為256*1的矩陣,得到256個不相同的數
RGBSS = RGBS(:, c, :);
axes(handles.axes2); %定義圖形區域axes2
imshow(RGBSS);
title('普通置亂加密圖像');
figure(2);
hist_im=histogram(RGBSS); %加密后直方圖
title('普通置亂加密直方圖');
像素點的RGB值縮放加密
像素點的RGB值縮放加密算法的流程
首先讀入原始圖片,通過size獲取水印圖片的大小矩陣,接着獲取圖片各R、G、B的值,然后將獲取到的RGB值分別擴大20倍並將值賦給r,最后再將r與將水印圖片轉換成double類型的矩陣進行點乘運算實現圖像的成功加密。算法流程框圖如圖:
算法分析
s = size(handles.img);
r = rand(s(1), s(2), s(3)) * 20;% 將原始圖片的RGB值分別擴大20倍
RGBD = im2double(handles.img);
RGB_jiami = RGBD .* r;
axes(handles.axes2); %定義圖形區域axes2
imshow(RGB_jiami);
title('像素點的RGB值縮放加密圖像');
figure(3);
hist_im=histogram(RGB_jiami); %加密后直方圖
title('像素點的RGB值縮放加密直方圖');
混沌Logistic映射加密算法
混沌Logistic映射加密算法模型
讀入待處理的原始圖片,通過加密密鑰進入混沌序列,通過混沌系統設計加密算法,實現加密目的;再輸入解密密鑰,把加密過程逆向運算即可得到解密圖像。系統參數u和初值x0設置成密鑰。混沌Logistic映射加密算法模型如圖:
當迭代n次后,我們就得到了x1、x2、…,xn這n個值,這就是一個混沌序列,是一維的,稱作序列A,也就是我們想要得到的序列,在MATLAB中,可以看出xi(i=1,2,…,n)的取值是在(0,1)之間的,就像圖像灰度值是在(0,255)之間一樣。那么我們把這個一維序列歸一化到(0,255)之間得到序列B。異或過程如圖:
算法分析
% x=0.1; % 定義初值x(0)=0.1
u=4; % 定義參數u=4
%迭代500次,達到充分混沌狀態
for i=1:500
x=u*x*(1-x);
end
fprintf('x(k+1)=%d\n',x); % 輸出迭代后的x的值
% picture是水印,D是水印對應的矩陣
% Imgn是混沌矩陣,Rod是水印與混沌異或結果
% img是還原出來的水印
%產生一維混沌加密序列
A=zeros(1,M*N); % 產生一個1-M*N的double類型的矩陣
A(1)=x; % 定義一維混沌初值
for i=1:M*N-1
A(i+1)=u*A(i)*(1-A(i));
end
%歸一化序列
B=uint8(255*A); % 產生一個1*M×N的uint8類型的矩陣
% 轉化為二維混沌加密序列
% 將矩陣B的元素返回到一個M×N的矩陣Imgn,其中Imgn是混沌矩陣
Imgn=reshape(B,M,N); % 按照列的順序進行轉換的,也就是第一列讀完,讀第二列,按列存放
C=zeros(M,N);
for x=1:M
for y=1:N
C(x,y)=handles.img(x,y);
end
end
C;
D=uint8(C); % D是水印圖像對應的矩陣
%異或操作加密(Logistic混沌序列加密)
Rod=bitxor(D,Imgn); %異或操作加密(水印矩陣和二維混沌序列異或結果)
Rod;
%轉化成uint8后圖像會變成二維,原來的picture是256*256*3的三通道后面轉換成256*768了,
%顯示是三個圖片,用rgb分別顯示了,合成一個圖片要用reshape(Rod,M,N/3,3)轉化回去
rod=reshape(Rod,M,N/3,3); % 把Rod中元素進行重塑成M×N/3×3的矩陣
驗證與性能分析
Matlab GUI操作界面
使用的是MATLAB GUI可視化仿真平台。它是采用圖形方式顯示的計算機操作用戶界面,是MATLAB用戶可視化交互式的工具,運用GUI生成的操作界面用戶可以不用瀏覽繁冗的代碼而進行操作。如圖是設計的GUI操作界面
看到這個界面是不是很不錯,對的。。。你沒看錯MATLAB GUI確實是這么厲害。。。。。。。
普通行列置亂加密實現
Lena原圖像、加密圖像、解密圖像
Baboon原圖像、加密圖像、解密圖像
像素點的RGB值的縮放加密實現
Lena原圖像、加密圖像、解密圖像
Baboon原圖像、加密圖像、解密圖像
混沌Logistic映射加密實現
Lena原圖像、加密圖像、解密圖像
Baboon原圖像、加密圖像、解密圖像
直方圖性能分析
這里就只對lena圖進行直方圖分析,Baboon圖大致和lena圖一樣。
Lena圖的普通置亂與混沌Logistic加密的直方圖
普通行列置亂圖像的直方圖與原始圖像的直方圖相同,且像素點的分布都不均勻,而混沌Logistic加密圖像的直方圖的像素點分布相對均勻,很好地隱藏了原始圖像的統計特性,達到了圖像加密的效果。
Lena圖的像素點的RGB縮放與混沌Logistic加密的直方圖
由直方圖可知:像素點的RGB縮放圖像的直方圖與原始圖像的直方圖不相同且像素點的分布都不均勻,而混沌Logistic加密圖像的直方圖的像素點分布相對均勻,很好地隱藏了原始圖像的統計特性。
完整代碼以上傳至我的github:完整代碼
資源傳送門
- 關注【做一個柔情的程序猿】公眾號
- 在【做一個柔情的程序猿】公眾號后台回復 【python資料】【2020秋招】 即可獲取相應的驚喜哦!
「❤️ 感謝大家」
- 點贊支持下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
- 歡迎在留言區與我分享你的想法,也歡迎你在留言區記錄你的思考過程。
你的三連擊是我的榮幸!!!!!