利用python設(shè)計圖像加密技術(shù)(Arnold算法)
下面展示了圖像的加密和解密過程(左邊是輸入圖像,中間是加密后的結(jié)果,右邊是解密后的圖像):
1、加密算法要求
- (1)加密算法必須是可逆的,擁有配套的解密算法
- (2)必須是安全的,攔截者不能輕易的破解加密方式
- (3)不能造成數(shù)據(jù)量劇增,比如一個1kb的圖像加密后變?yōu)?00kb
2、Arnold置亂原理
Arnold
置亂又稱為貓臉置亂,據(jù)說是因為Arnold首先對貓臉圖像應(yīng)用了這個算法。置亂的含義是置換和打亂,也就是將原始的圖片按照我們設(shè)計的規(guī)則,進行順序打亂的操作。
所謂的打亂次序指的是對圖像進行“坐標(biāo)變換”,只不過這種變換不是隨意的變換,變換需要具有兩個硬性要求:
- (1)變換就是加密,那么必須存在對應(yīng)的逆變換(解密)
- (2)變換能保證圖像的像素被徹底打亂,觀察者看不出加密后圖像包含的信息
為此,Arnold發(fā)明了下面的變換方式:
其中x和y表示坐標(biāo),new
表示變換以后的坐標(biāo),ori表示原始的坐標(biāo)(original縮寫),a和b是兩個可選的參數(shù),mod為求余數(shù)操作,N是圖像的長或者寬,這里只考慮長度和寬度相等的圖像,上式表示的就是“圖像的坐標(biāo)變換”。
有了加密變換,還需要使用對應(yīng)的解密變換,也就是逆變換。逆變換就是“求矩陣的逆”,對2x2的矩陣求逆就能得到下面的逆變換矩陣:
根據(jù)加密變換和解密變換,就能設(shè)計圖像加密算法和解密算法了!
實際上,上面的加密和解密也都是常規(guī)的矩陣變換,一點都不難!
3、python實現(xiàn)
根據(jù)上一節(jié)的加密變換公式可知,有幾個參數(shù)是必須考慮的,比如:打亂的次數(shù),a和b的取值(我覺得這兩個值是隨便取的,取不同值加密結(jié)果不同),N是圖像的長度或者寬度所以不需要指定。
加密函數(shù)如下:
def arnold_encode(image, shuffle_times, a, b): ? ? """ Arnold shuffle for rgb image ? ? Args: ? ? ? ? image: input original rgb image ? ? ? ? shuffle_times: how many times to shuffle ? ? Returns: ? ? ? ? Arnold encode image ? ? """ ? ? # 1:創(chuàng)建新圖像 ? ? arnold_image = np.zeros(shape=image.shape) ? ?? ? ? # 2:計算N ? ? h, w = image.shape[0], image.shape[1] ? ? N = h ? # 或N=w ? ?? ? ? # 3:遍歷像素坐標(biāo)變換 ? ? for time in range(shuffle_times): ? ? ? ? for ori_x in range(h): ? ? ? ? ? ? for ori_y in range(w): ? ? ? ? ? ? ? ? # 按照公式坐標(biāo)變換 ? ? ? ? ? ? ? ? new_x = (1*ori_x + b*ori_y)% N ? ? ? ? ? ? ? ? new_y = (a*ori_x + (a*b+1)*ori_y) % N ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? arnold_image[new_x, new_y, :] = image[ori_x, ori_y, :] ? ? ? ? ? ?? ? ? return arnold_image
調(diào)用加密函數(shù)以后可以得到如下的加密結(jié)果:
現(xiàn)在,誰還能看出來加密后的圖像(左邊是原始圖,右邊是加密后的圖)表達什么?
除非你有下面的解密代碼:
def arnold_decode(image, shuffle_times, a, b): ? ? """ decode for rgb image that encoded by Arnold ? ? Args: ? ? ? ? image: rgb image encoded by Arnold ? ? ? ? shuffle_times: how many times to shuffle ? ? Returns: ? ? ? ? decode image ? ? """ ? ? # 1:創(chuàng)建新圖像 ? ? decode_image = np.zeros(shape=image.shape) ? ?? ? ? # 2:計算N ? ? h, w = image.shape[0], image.shape[1] ? ? N = h # 或N=w ? ?? ? ? # 3:遍歷像素坐標(biāo)變換 ? ? for time in range(shuffle_times): ? ? ? ? for ori_x in range(h): ? ? ? ? ? ? for ori_y in range(w): ? ? ? ? ? ? ? ? # 按照公式坐標(biāo)變換 ? ? ? ? ? ? ? ? new_x = ((a*b+1)*ori_x + (-b)* ori_y)% N ? ? ? ? ? ? ? ? new_y = ((-a)*ori_x + ori_y) % N ? ? ? ? ? ? ? ? decode_image[new_x, new_y, :] = image[ori_x, ori_y, :] ? ? return decode_image
調(diào)用解密代碼,就能恢復(fù)最右邊的“decode”了:
4、結(jié)果分析與總結(jié)
自己還嘗試了不同的a和b的值獲得的不同加密效果:
男神鎮(zhèn)樓!
(1)a = 1, b = 1:
(2)a=1,b=3:
(3)a=1,b=7:
(4) a=7, b=1:
可以看出:a和b作為控制加密的參數(shù),不同的選擇方式可以獲得不同的加密效果。
到此這篇關(guān)于利用python設(shè)計圖像加密技術(shù)(Arnold算法)的文章就介紹到這了,更多相關(guān)python圖像加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Python的Tornado框架結(jié)合memcached頁面改善博客性能
這篇文章主要介紹了用Python的Tornado框架結(jié)合memcached頁面改善vLog性能,主要使用到了緩存來提升性能,需要的朋友可以參考下2015-04-04python腳本內(nèi)運行l(wèi)inux命令的方法
這篇文章主要介紹了python腳本內(nèi)運行l(wèi)inux命令的方法,實例分析了Python基于subprocess模塊操作Linux命令的相關(guān)技巧,需要的朋友可以參考下2015-07-07深度學(xué)習(xí)TextLSTM的tensorflow1.14實現(xiàn)示例
這篇文章主要為大家介紹了深度學(xué)習(xí)TextLSTM的tensorflow1.14實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01總結(jié)用Pdb庫調(diào)試Python的方式及常用的命令
大家都知道Python是自帶Pdb庫,使用Pdb調(diào)試Python程序還是很方便的。但是遠(yuǎn)程調(diào)試、多線程,Pdb是搞不定的,下面一起來看看用Pdb庫調(diào)試Python的方式及常用的命令。2016-08-08TensorFlow實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了TensorFlow實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05