一種基於混沌Logistic加密算法的圖片加密與還原的方法,並利用Lena圖和Baboon圖來驗證這種加密算法的加密效果。爲了可以體現該算法在圖片信息加密的效果,本文還採用了普通行列置亂加密算法和像素點的RGB的值的縮放算法這兩種算法對相同的圖片的圖片進行處理,利用matlab經過顯示加密事後的圖片以及直方圖分析能夠很直觀的發現混沌Logistic加密算法對圖片信息加密的效果更好,而且很好地隱藏了原始圖像的統計特性,可以有效地抵禦基於圖像像素值的統計攻擊,達到了圖像加密的效果。python
1975年,美國數學家約克和美籍華人李天巖發表了《週期3意味着混沌》的文章,首次提出了「混沌」—詞,闡述了混沌的數學定義,對混沌學的發展具備重大意義。自此之後,混沌研究開始蓬勃發展。
混沌是指在肯定性動力學系統中,因爲對初值敏感而表現出的相似隨機的、不可預測的運動。混沌是肯定的非線性系統中出現的內在隨機性現象,其變化並不是隨機確貌似隨機。git
Logistic映射是一個典型的非線性的迭代方程,如式所示:github
稱爲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分岔圖
bash
將讀入的水印圖片,先獲取圖片的大小,獲得原始圖片矩陣,首先隨機打亂各行,輸出打亂後的矩陣,再將這個矩陣隨機打亂各列,最後圖像成功加密,顯示加密圖像。算法流程框圖如圖:
工具
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('普通置亂加密直方圖');
首先讀入原始圖片,經過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值縮放加密直方圖');
讀入待處理的原始圖片,經過加密密鑰進入混沌序列,經過混沌系統設計加密算法,實現加密目的;再輸入解密密鑰,把加密過程逆向運算便可獲得解密圖像。系統參數u和初值x0設置成密鑰。混沌Logistic映射加密算法模型如圖:
ui
當迭代n次後,咱們就獲得了x一、x二、…,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生成的操做界面用戶能夠不用瀏覽繁冗的代碼而進行操做。如圖是設計的GUI操做界面
設計
看到這個界面是否是很不錯,對的。。。你沒看錯MATLAB GUI確實是這麼厲害。。。。。。。
Lena原圖像、加密圖像、解密圖像
Baboon原圖像、加密圖像、解密圖像
Lena原圖像、加密圖像、解密圖像
Baboon原圖像、加密圖像、解密圖像
Lena原圖像、加密圖像、解密圖像
Baboon原圖像、加密圖像、解密圖像
這裏就只對lena圖進行直方圖分析,Baboon圖大體和lena圖同樣。
Lena圖的普通置亂與混沌Logistic加密的直方圖
普通行列置亂圖像的直方圖與原始圖像的直方圖相同,且像素點的分佈都不均勻,而混沌Logistic加密圖像的直方圖的像素點分佈相對均勻,很好地隱藏了原始圖像的統計特性,達到了圖像加密的效果。
Lena圖的像素點的RGB縮放與混沌Logistic加密的直方圖
由直方圖可知:像素點的RGB縮放圖像的直方圖與原始圖像的直方圖不相同且像素點的分佈都不均勻,而混沌Logistic加密圖像的直方圖的像素點分佈相對均勻,很好地隱藏了原始圖像的統計特性。
完整代碼以上傳至個人github:完整代碼
你的三連擊是個人榮幸!!!!!