随着科学技术的发展,网络通讯的速度越来越快,同时,随着手机像素和提高功能的进步,人们对于图像数据的传输和存储的需求日益增长。而在这过程中,隐私问题也越来越受到人们重视,对于图像数据的加密成为信息安全研究领域的重点研究问题。本文应用了两种简单的办法对图像进行加密,并作出对比。
平移像素点加密
加密算法:
- 找到图片的大小,其中width表示宽度,height表示高度
- 随机数生成密钥key_updown和key_leftright,分别表示列像素和行像素平移的距离
- 分别进行两次循环,第一次对所有列像素进行平移,第二次对行像素进行平移
- 最后的到加密后的图像
该算法采用对称加密算法,其中密钥为随机生成的平移步数,需要将其发给解密者,然后对行像素和列像素进行反向平移,即可解密。
加密代码
from PIL import ImageColor
from PIL import Image
import random
dog = Image.open('dog.jpeg')
width, height = dog.size
dog_updown = dog.copy()
key_updown = []
for i in range(width):
x = random.randint(0, height)
key_updown.append(x)
for j in range(height):
pix = dog.getpixel((i, j))
dog_updown.putpixel((i, (j + x) % width), pix)
dog_updown.save('dog_new1.jpeg')
dog_leftright = dog_updown.copy()
key_leftright = []
for j in range(height):
x = random.randint(0, width)
key_leftright.append(x)
for i in range(height):
pix = dog_updown.getpixel((i, j))
dog_leftright.putpixel(((i + x) % width, j), pix)
dog_leftright.save('dog_new2.jpeg')
for j in range(height):
x = key_leftright[j]
key_leftright.append(x)
for i in range(height):
pix = dog_leftright.getpixel((i, j))
dog_updown.putpixel(((i - x + width) % width, j), pix)
for i in range(width):
x = key_updown[i]
for j in range(height):
pix = dog_updown.getpixel((i, j))
dog.putpixel((i, (j - x + height) % width), pix)
dog.save('dog_back.jpeg')
实现效果
三维Anorld置换加密
Arnold加密算法:
对于一个二维图像image,图像大小为N*N,对于图像中的任一像素点p(x, y),其中x属于[0, N - 1],y属于[0, N - 1], 将其坐标变换为p(x’, y’),坐标变换满足下矩阵变换式子,其中矩阵A称为变换矩阵:
该加密算法的密钥为利用变换矩阵的加密的次数N,解密的办法,可以利用可你矩阵对原图像进行N次变换,或者继续利用变换矩阵对图像进行加密,直至一个周期
加密代码
from PIL import Image
from numpy import asarray
dog = Image.open('new_dog2.jpeg')
width, height = dog.size
dog_array = asarray(dog)
def arnold(x, y, z):
xx = (x + y + z) % 255
yy = (x + 2 * y + 2 * z) % 255
zz = (x + 2 * y + 3 * z) % 255
return [xx, yy, zz]
for i in range(0, width):
for j in range(0, height):
x = dog_array[i][j]
[a, b, c] = arnold(x[0], x[1], x[2])
dog_array[i][j] = [a, b, c]
new_dog = Image.fromarray(dog_array)
new_dog.save('new_dog.jpeg')
实现效果
一次arnold置换:
五次arnold置换:
十次arnold置换:
十五次arnold置换:
考虑到如果采用二维arnold变换加密,结果与平移算法比较,像素点打乱更随机,但是仍然保留了每个像素点的颜色信息。本文采用三维Arnold变换矩阵,对每个像素点的RGB值进行三维Arnold变换,最终加密的图像足够混乱,且发现变换次数越多,加密效果越好,但是一般一定次数之后,像素点颜色的随机性就已经趋于稳定了。
总结
平移像素点的方法一定程度上可以对原图进行加密,但是仍然保留了原图色彩的特征。而arnold转置法对每个像素点的RGB值进行转置,进而对图片加密效果更好,计算量也更大,需要对每个像素点进行N次计算,其中每个像素点的计算包含对RGB三个值的变换。
写得太好了……
但是我一点都没看懂