以下代码使用python实现的复合混沌加密一张图片
- import cv2
- import math
- import numpy as np
- def int2bin8(x): # 整型转8位二进制
- result="";
- for i in range(8):
- y=x&(1)
- result+=str(y)
- x=x>>1
- return result[::-1]
- def int2bin16(x): # 整型转8位二进制
- result="";
- for i in range(16):
- y=x&(1)
- result+=str(y)
- x=x>>1
- return result
- def Encryption(img,j0,g0,x0,EncryptionImg):
- x = img.shape[0]
- y = img.shape[1]
- c = img.shape[2]
- g0 = int2bin16(g0)
- for s in range(x):
- for n in range(y):
- for z in range(c):
- m = int2bin8(img[s][n][z]) # 像素值转八位二进制
- ans=""
- print("ok")
- for i in range(8):
- ri=int(g0[-1]) # 取手摇密码机最后一位ri
- qi=int(m[i])^ri # 与像素值异或得qi
- xi = 1 - math.sqrt(abs(2 * x0 - 1)) # f1(x)混沌迭代
- if qi==0: # 如果qi=0,则运用x0i+x1i=1;
- xi=1-xi;
- x0=xi # xi迭代
- t=int(g0[0])^int(g0[12])^int(g0[15]) # 本源多项式x^15+x^3+1
- g0=str(t)+g0[0:-1] # gi迭代
- ci=math.floor(xi*(2**j0))%2 # 非线性转换算子
- ans+=str(ci)
- re=int(ans,2)
- EncryptionImg[s][n][z]=re # 写入新图像
- def Decryption(EncryptionImg, j0, g0, x0, DecryptionImg):
- x = EncryptionImg.shape[0]
- y = EncryptionImg.shape[1]
- c = EncryptionImg.shape[2]
- g0 = int2bin16(g0)
- for s in range(x):
- for n in range(y):
- for z in range(c):
- cc = int2bin8(img[s][n][z])
- ans = ""
- print("no")
- for i in range(8):
- xi = 1 - math.sqrt(abs(2 * x0 - 1))
- x0 = xi
- ssi = math.floor(xi * (2 ** j0)) % 2
- qi=1-(ssi^int(cc[i]))
- ri = int(g0[-1])
- mi=ri^qi
- t = int(g0[0]) ^ int(g0[12]) ^ int(g0[15])
- g0 = str(t) + g0[0:-1]
- ans += str(mi)
- re = int(ans, 2)
- DecryptionImg[s][n][z] = re
- if __name__ == "__main__":
- img = cv2.imread("D:/pycharmproject/network_security/2.bmp", 1) # 读取原始图像
- cv2.imshow("img", img) # 显示原图
- EncryptionImg = np.zeros(img.shape, np.uint8)
- Encryption(img,10,30,0.123345,EncryptionImg) # 加密
- cv2.imwrite("D:/pycharmproject/network_security/EncryptionImg2.bmp",EncryptionImg) # 保存
- cv2.imshow("EncryptionImg", EncryptionImg) # 显示
- img = cv2.imread("D:/pycharmproject/network_security/EncryptionImg2.bmp", 1) # 读取加密图像
- DecryptionImg = np.zeros(img.shape, np.uint8)
- Decryption(img, 10, 30, 0.123345, DecryptionImg) # 解密
- cv2.imwrite("D:/pycharmproject/network_security/DecryptionImg2.bmp", DecryptionImg) # 保存
- cv2.imshow("DecryptionImg ", DecryptionImg) # 显示
- cv2.waitKey(0)
复制代码 |