ITPub博客

首页 > IT职业 > IT职场 > 【Python学习笔记】图片中隐藏信息——图片隐写术

【Python学习笔记】图片中隐藏信息——图片隐写术

IT职场 作者:wzzhujun 时间:2021-09-09 09:26:35 0 删除 编辑

主要原理:

图片是由一个个像素组成的。每个像素由一组(r,g,b)值表示(png格式图片,多一个alpha透明度值)。而对于单个r,g或b,其范围在0~255之间,可由一个字节(8位表示)。因此,当改变最低位的值时,对于整个图片来说,其视觉效果通过肉眼看不出来的。比如一组颜色白色(255,255,255),变为(254,255,255)时,是看不出来变化的。
因此,可将一组待隐藏信息转换为二进制后,再将每个二进制码存储在图片的像素中。

图片描述

原图片.png


图片描述

隐藏有信息后的图片.png

实现步骤

加密
  • 获取原图片像素(list)

  • 使像素最低位变为偶数

  • 待隐藏信息转换为二进制,并且对于单字节字符,当位数不够8时,在最高位补0

  • 将二进制的待隐藏信息依次与图片中每个像素的r、g、b进行相加

解密
  • 获取隐藏有信息的图片的像素(list)

  • 获取像素值的最低位(隐藏的信息存储位置)

  • 获取存储的信息的二进制值

  • 按每8位为一组,将上述二进制转换为十进制形式

  • 采用chr函数,将十进制转为字符并存储到字符串中

源码

# -*- coding: utf-8 -*-from PIL import Imageimport sys 

reload(sys) 
sys.setdefaultencoding('utf8') 

"""
取得一个 PIL 图像并且更改所有值为偶数(使最低有效位为 0)
"""def makeImageEven(image):
    pixels = list(image.getdata())  # 得到一个这样的列表: [(r,g,b,t),(r,g,b,t)...]
    evenPixels = [(r>>1>1>1>1 len(image.getdata()) * 4:  # 如果不可能编码全部数据, 抛出异常
        raise Exception("Error: Can't encode more than " + len(evenImage.getdata()) * 4 + " bits in this image. ")
    encodedPixels = [(r+int(binary[index*4+0]),g+int(binary[index*4+1]),b+int(binary[index*4+2]),t+int(binary[index*4+3])) if index*4 >1>1>1>1

参考来源

https://www.shiyanlou.com/courses/651



作者:八月之雨
链接:https://www.jianshu.com/p/72f0d0953ca4


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3370/viewspace-2809907/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: PHP 字符串处理
请登录后发表评论 登录
全部评论

注册时间:2019-08-14

  • 博文量
    83
  • 访问量
    733