图像隐写(Image Steganography)
引言
今天学习了图像隐写,图像隐写就是把信息隐藏写入到数字图像里面,一般情况下看不出有什么,需要去解析后才能获取隐藏的内容。然后自己写了下python代码实现下:1.从图像空域隐写信息;2.从图像频域隐写信息;3.用stegano包直接调用接口进行隐写。
空域隐写
显示器的标准格式就用(R,G,B)表示一个像素的颜色显示,其范围为黑色(0, 0, 0)~ 白色(255, 255, 255)。用每一个都是用8 bit的信息的表示,其中隐写的LSB(Least Significant Bits)算法就是用最后一个bit来写入信息而图像不至于失真太明显。
from PIL import Image, ImageDraw, ImageFont
import numpy as np
from matplotlib import pyplot as plt
# 画一张跟原始图像一样大小的水印图像,把字符串用黑色微软雅黑14号大小循环画成水印图像
def draw_a_water_mark_img(img_size, img_mode, water_mark_str):
image_draw = Image.new(img_mode, img_size,"white")
draw = ImageDraw.Draw(image_draw)
# 字体大小,用的是微软雅黑
font_size = 14
water_mark_size = len(water_mark_str)
x_step_num = int(img_size[0] / font_size)
y_step_num = int(img_size[1] / font_size)
k = 0
for j in range(y_step_num):
for i in range(x_step_num):
draw.text((i * font_size,j * font_size),water_mark_str[k%water_mark_size], font=ImageFont.truetype("msyh.ttc",font_size),fill="black")
k=k+1
return image_draw
# 通过先右移再左移的移位操作使最后的1个bit为0,形成新的原始图像
def make_least_significant_bit_0(img):
img_list = list(img.getdata())
new_im