隐写术
隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganographia,该书书名源于希腊语,意为“隐秘书写”。
今天训练营带大家将信息隐藏在图片中
Pillow 是PIL的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。
首先明确我们要加密的信息
infor = "passwd:2342432wdqfqsq"
构建一个方法将加密信息转换为二进制的形式这样可以塞到我们的图片中
def get_key(strr):
s = strr.encode("utf-8")
print(len(s)) # 获取长度这很重要在解密当中我们需要这个
str = ""
for i in range(len(s)):
str = str + bin(s[i]).replace('0b', '').zfill(8)
return str
这里需要注意的是使用bin()转二进制后,二进制字符串的前面会有"0b"所以用replace()删掉,删掉之后是七位,而正常情况下每个字符由8位二进制组成,所以使用zfill(8)进行填充
接下来构建一个方法用来处理图片,首先获取宽高来遍历每一个像素点使我们可以得到每一个像素点的RGB,在每个点的RGB后插入我们的二进制信息
def func(infor):
pic = Image.open(r"I:pythonProject9132134.png")
width = pic.size[0]
height = pic.size[1]
# 获取宽高
count = 0
key = get_key(infor)
keylen = len(key)
# print(keylen)
for h in range(0, height):
for w in range(0, width):
pixel = pic.getpixel((w, h)) # 返回该像素点三原色的二进制信息,形成一个数组
a = pixel[0] # R
b = pixel[1] # G
c = pixel[2] # B
if count == keylen:
break
a = a - mod(a, 2) + int(key[count])
count += 1
if count == keylen:
pic.putpixel((w, h), (a, b, c))
break
b = b - mod(b, 2) + int(key[count])
count += 1
if count == keylen:
pic.putpixel((w, h), (a, b, c))
break
c = c - mod(c, 2) + int(key[count])
count += 1
if count == keylen:
pic.putpixel((w, h), (a, b, c))
break
if count % 3 == 0:
pic.putpixel((w, h), (a, b, c))
pic.save(r"I:pythonProject9test.png")
def mod(x, y):
return x % y
还记得刚才在转化二进制前记录的长度么现在顶用了,输入图片的地址和字符串长度
le = 21
new = r"I:pythonProject9test.png"
构建函数来解密,依旧是先获取宽高来遍历每一个像素点获取RGB,提取RGB的值进行解密
def func(le, pic):
b = ""
im = Image.open(pic)
lenth = le * 8
width = im.size[0]
height = im.size[1]
count = 0
for h in range(0, height):
for w in range(0, width):
pixel = im.getpixel((w, h))
if count % 3 == 0:
count += 1
b = b + str((mod(pixel[0], 2)))
if count == lenth:
break
if count % 3 == 1:
count += 1
b = b + str((mod(pixel[1], 2)))
if count == lenth:
break
if count % 3 == 2:
count += 1
b = b + str((mod(pixel[2], 2)))
if count == lenth:
break
if count == lenth:
break
infor = ''
for i in range(0, len(b), 8):
stra = int(b[i:i + 8], 2)
infor = infor + chr(stra)
stra = ""
print(infor)
def mod(x, y):
return x % y;
地址|北京市海淀区奥北科技园20号楼5层
原文始发于微信公众号(大学生网络安全尖锋训练营):【学习园地】python图片隐写
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论