图片加密(一)颜色加密

图片加密(一)颜色加密

前置内容:图片的储存方式

图片是由一个个像素点组成的。对于有色图片来说,每一个像素点的颜色可以由红绿蓝三种颜色合成,也就是可能听说过的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()

把所有的代码拼起来应该就可以运行了吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值