亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

利用python設(shè)計圖像加密技術(shù)(Arnold算法)

 更新時間:2022年03月10日 09:03:45   作者:機器學(xué)習(xí)入坑者  
這篇文章主要介紹了利用python設(shè)計圖像加密技術(shù)(Arnold算法),本文將借助Arnold置亂法,講解如何用python從頭至尾設(shè)計出一套圖像加密算法,需要的小伙伴可以才參考一下

下面展示了圖像的加密和解密過程(左邊是輸入圖像,中間是加密后的結(jié)果,右邊是解密后的圖像):

1、加密算法要求

  • (1)加密算法必須是可逆的,擁有配套的解密算法
  • (2)必須是安全的,攔截者不能輕易的破解加密方式
  • (3)不能造成數(shù)據(jù)量劇增,比如一個1kb的圖像加密后變?yōu)?00kb

2、Arnold置亂原理

Arnold置亂又稱為貓臉置亂,據(jù)說是因為Arnold首先對貓臉圖像應(yīng)用了這個算法。置亂的含義是置換和打亂,也就是將原始的圖片按照我們設(shè)計的規(guī)則,進行順序打亂的操作。

所謂的打亂次序指的是對圖像進行“坐標變換”,只不過這種變換不是隨意的變換,變換需要具有兩個硬性要求:

  • (1)變換就是加密,那么必須存在對應(yīng)的逆變換(解密)
  • (2)變換能保證圖像的像素被徹底打亂,觀察者看不出加密后圖像包含的信息

為此,Arnold發(fā)明了下面的變換方式:

其中x和y表示坐標,new表示變換以后的坐標,ori表示原始的坐標(original縮寫),a和b是兩個可選的參數(shù),mod為求余數(shù)操作,N是圖像的長或者寬,這里只考慮長度和寬度相等的圖像,上式表示的就是“圖像的坐標變換”。

有了加密變換,還需要使用對應(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:遍歷像素坐標變換
? ? for time in range(shuffle_times):
? ? ? ? for ori_x in range(h):
? ? ? ? ? ? for ori_y in range(w):
? ? ? ? ? ? ? ? # 按照公式坐標變換
? ? ? ? ? ? ? ? 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:遍歷像素坐標變換
? ? for time in range(shuffle_times):
? ? ? ? for ori_x in range(h):
? ? ? ? ? ? for ori_y in range(w):
? ? ? ? ? ? ? ? # 按照公式坐標變換
? ? ? ? ? ? ? ? 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)文章

最新評論