69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
"""
|
|||
|
Created on Sun May 19 12:43:26 2019
|
|||
|
|
|||
|
@author: Administrator
|
|||
|
"""
|
|||
|
|
|||
|
from PIL import Image
|
|||
|
|
|||
|
def mod(x,y):
|
|||
|
return x%y
|
|||
|
|
|||
|
def toasc(strr):
|
|||
|
return int(strr, 2)
|
|||
|
|
|||
|
|
|||
|
#le为所要提取的信息的长度,str1为加密载体图片的路径,str2为提取文件的保存路径
|
|||
|
def func(le,str1,str2):
|
|||
|
b=""
|
|||
|
im = Image.open(str1)
|
|||
|
lenth = le*8
|
|||
|
width,height = im.size[0],im.size[1]
|
|||
|
count = 0
|
|||
|
for h in range(height):
|
|||
|
for w in range(width):
|
|||
|
#获得(w,h)点像素的值
|
|||
|
pixel = im.getpixel((w, h))
|
|||
|
#此处余3,依次从R、G、B三个颜色通道获得最低位的隐藏信息
|
|||
|
if count%3==0:
|
|||
|
count+=1
|
|||
|
b=b+str((mod(int(pixel[0]),2)))
|
|||
|
if count ==lenth:
|
|||
|
break
|
|||
|
if count%3==1:
|
|||
|
count+=1
|
|||
|
b=b+str((mod(int(pixel[1]),2)))
|
|||
|
if count ==lenth:
|
|||
|
break
|
|||
|
if count%3==2:
|
|||
|
count+=1
|
|||
|
b=b+str((mod(int(pixel[2]),2)))
|
|||
|
if count ==lenth:
|
|||
|
break
|
|||
|
if count == lenth:
|
|||
|
break
|
|||
|
|
|||
|
with open(str2,"w",encoding='utf-8') as f:
|
|||
|
for i in range(0,len(b),8):
|
|||
|
#以每8位为一组二进制,转换为十进制
|
|||
|
stra = toasc(b[i:i+8])
|
|||
|
#将转换后的十进制数视为ascii码,再转换为字符串写入到文件中
|
|||
|
#print((stra))
|
|||
|
f.write(chr(stra))
|
|||
|
print("完成信息提取!")
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
def main():
|
|||
|
#文件长度
|
|||
|
le = 11
|
|||
|
#含有隐藏信息的图片
|
|||
|
new = "new.png"
|
|||
|
#信息提取出后所存放的文件
|
|||
|
get_info = "get_flag.txt"
|
|||
|
func(le,new,get_info)
|
|||
|
|
|||
|
if __name__=='__main__':
|
|||
|
main()
|