图片加密(一)颜色加密
前置内容:图片的储存方式
图片是由一个个像素点组成的。对于有色图片来说,每一个像素点的颜色可以由红绿蓝三种颜色合成,也就是可能听说过的RGB。
在计算机中,用0~255来表示这三种颜色每个颜色的程度,于是每个像素点可由三个数字表示。读取图片可使用如下方法(注意,用的是python):
import cv2 # 这里使用了cv2进行图片的读取,需要下载opencv库
import random #用来获取随机数用于加密
img_cv = cv2.imread('c.jpg') # 读取图片
print(img_cv)
因此,如图一张162×157分辨率的图片可视为一个162×157×3的三维矩阵(矩阵排版奇怪,应该能看出来吧QAQ)
开始操作
知道图片的储存方式,它的一个简单的加密方式就呼之欲出了。按一定规律改变矩阵的数值就能很好地把图片变得面目全非。解密图片则只需将改变的过程进行一个逆操作就能得到原先的图片。
密钥生成
我们随机生成一个对应关系,使得0~255这些数字一一对应到相同范围内不同的数,且可逆。使用列表存储正逆对应关系。
lent1 = len(img_cv) # 高度
lent2 = len(img_cv[1]) # 宽度
lent3 = 3 # 三个表示颜色
siph = [] # 加密对应表
solv = [] # 解密对应表
for i in range(0, 256): # 预处理
siph.extend([i])
solv.extend([0])
random.shuffle(siph) # 打乱形成加密对应,i对应siph[i]
for i in range(0, 256):
solv[siph[i]] = i # 解密对应,solv[siph[i]]对应i
遍历每一个值,使之变为对应的数,则可使图片的颜色变得诡异。下面是代码:
for i in range(lent1):
for j in range(lent2):
for k in range(lent3):
img_cv[i][j][k] = siph[img_cv[i][j][k]]
cv2.namedWindow("a") # 此两行命名、显示加密图片
cv2.imshow("a", img_cv)
现在让我们来看一下效果图:
可以看出变化不小,但是还是能看出面大致的轮廓,而且对于纯色的部分加密后依然是纯色。这是加密的规则比较简单的缘故。大家大可设计一些复杂的加密方法来使效果更好(例如每个像素有独特的方法啥的)
解密的原理和加密相同,相当于再加密又加密回去了,这里直接上代码:
for i in range(lent1):
for j in range(lent2):
for k in range(lent3):
img_cv[i][j][k] = solv[img_cv[i][j][k]]
cv2.namedWindow("b")
cv2.imshow("b", img_cv)
cv2.waitKey()
cv2.destroyAllWindows()
把所有的代码拼起来应该就可以运行了吧。