1. 什么是隐写?

隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganographia,该书书名源于希腊语,意为“隐秘书写”。

2. 什么是图片隐写?

图片隐写术这项技术可以将秘密信息嵌入到图片媒介中而不损坏它的载体的质量。第三方既觉察不到秘密信息的存在,也不知道存在秘密信息。因此密钥、数字签名和私密信息都可以在开放的环境(如Internet或者内联网)中安全的传送。简单概括就是信息明明就在眼前,但是你却视而不见

3. LSB隐写的原理

在png图片的存储中,每个颜色表示需要有8bit,即有256种颜色,一共包含256的三次方个颜色,即16777216中颜色,人类的眼睛可以区分约1,000万种不同的颜色,剩下无法区分的颜色就有6777216。

那么什么是LSB呢,每个像素点的颜色可以用十进制0~255的数值表示,那么上图中的RGB(218,150,149)表示成二进制为:

LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,我们仅对RGB中的最低位进行修改,如当前像素位点最后一位修改成1,1,0.则上述RGB变成218->219:

上述变化很难用肉眼察觉到,而且每一个像素位点携带了一位信息,那么我们可以利用八个字节的最低位存储一个比特信息,而该比特信息则可以转化为ASCII字符,从而达到隐写信息的目的。

4. 如何实现LSB隐写?

import numpy as np
import PIL.Image as Image# 读取图片的像素信息
picture = Image.open('./pic/pic.jpg')
pic_data = np.array(picture)# 读取要隐写的文件,长度为4893
with open('./pic/secret.py', encoding="utf-8") as file:secrets = file.read()# 将图片拷贝一份,作为最终的图片数据
im_data = np.array(picture.copy()).ravel().tolist()def cover_lsb(bin_index, data):''':param bin_index:  当前字符的ascii的二进制:param data: 取出数组像素的八个数值:return: LSB隐写后的字符'''res = []for i in range(8):data_i_bin = bin(data[i])[2:].zfill(8)if bin_index[i] == '0':data_i_bin = data_i_bin[0:7] + '0'elif bin_index[i] == '1':data_i_bin = data_i_bin[0:7] + '1'res.append(int(data_i_bin, 2))return respic_idx = 0
# 采用LSB隐写技术,横向取数据,每次取9个数据,改变8个像素最低位
res_data = []
for i in range(len(secrets)):# 拿到隐写文件的字符ascii数值, 并转换为二进制,填充成八位index = ord(secrets[i])bin_index = bin(index)[2:].zfill(8)# 对数据进行LSB隐写,替换操作res = cover_lsb(bin_index, im_data[pic_idx * 8: (pic_idx + 1) * 8])pic_idx += 1res_data += res
# 对剩余未填充的数据进行补充填充,防止图像无法恢复
res_data += im_data[pic_idx * 8:]# 将新生成的文件进行格式转换并保存,此处一定保存为压缩的png文件
new_im_data = np.array(res_data).astype(np.uint8).reshape((pic_data.shape))
res_im = Image.fromarray(new_im_data)
res_im.save('./pic/res_encode.png')

5. 如何实现隐写数据还原?

import numpy as np
import PIL.Image as Image# 打开隐写文件
picture = Image.open('./pic/res_encode.png')
pic_datas = np.array(picture).ravel().tolist()# 字符的长度为4893
with open('./pic/secret.py', encoding="utf-8") as file:secrets = file.read()str_len = len(secrets)
print('字符的长度为:', str_len)# 将图片拷贝一份,作为最终的图片数据
im_data = np.array(picture.copy()).ravel().tolist()def lsb_decode(data):''':param bin_index:  当前字符的ascii的二进制:param data: 取出数组像素的八个数值:return: LSB隐写后的字符'''str = ''for i in range(len(data)):print(bin(data[i])[2:])data_i_bin = bin(data[i])[2:][-1]str += data_i_binreturn strpic_idx = 0
# 采用LSB隐写技术,横向取数据,每次取9个数据,改变8个像素最低位
res_data = []for i in range(len(secrets)):# 拿到第i个数据,转换成二进制data = im_data[i * 8: (i + 1) * 8]data_int = lsb_decode(data)# 找到最低位res_data.append(int(data_int, 2))# 将二进制数据转换成ASCII
str_data = ''
for i in res_data:temp = chr(i)str_data += temp
print(str_data)

6. 总结

基本的LSB原理很简单,最容易实现,但是鲁棒性不佳,后续更好的隐藏信息,则会通过数字水印技术实现,后面文章再进行更新。

图片隐写之LSB(Least Significant Bit)原理及其代码实现相关推荐

  1. 【LSB】图片隐写文档大纲

    第一章 绪论 1.1研究背景 1.2研究意义 1.3主要工作 第二章 图片隐写和LSB算法 2.1关于图片隐写术 2.2LSB算法 第三章 系统设计与实现 3.1图像的加载 3.2文本的预编码 3.3 ...

  2. 推荐几篇图片隐写技术的文章

    这几天了解与学习图片隐写相关的技术点,在查找与阅读相关的文章后,选了三篇不错的文章推荐给大家. 说明:三篇文章是一个系列,专门讲图片隐写.内容全面,有原理介绍,还有实践操作指引,可所谓用心之作,很棒! ...

  3. 关于LSB图片隐写的解法

    关于LSB图片隐写的解法 LSB全称为 least significant bit,是最低有效位的意思.Lsb图片隐写是基于lsb算法的一种图片隐写术. 隐写是一种信息隐藏技术,这项技术目标是使对方对 ...

  4. python图片隐写_机窝安全--LSB图片隐写

    人类能说识别大概1000万中颜色,而BMP等的三原色有从0x00~0xFF,也就是有256的3次方,大概是1600多万,也就是说人类大概有600万颜色无法识别,但是机器并不是通过像素识别,而是通过该像 ...

  5. python图片隐写_Lsb图片隐写

    前言 在刚刚过去的网鼎杯第一场比赛中,做到了一道杂项题是关于lsb隐写的.LSB全称为 least significant bit,是最低有效位的意思.Lsb图片隐写是基于lsb算法的一种图片隐写术, ...

  6. CTF学习之MISC之图片隐写与文档隐写

    CTF学习之MISC之图片隐写 隐写术概述 图片隐写技术 图片EXIF信息隐写 图片LSB低位隐写 隐写术(Stega) 隐写术(Steganography,简写Stega) 一门关于信息隐藏的技巧与 ...

  7. 【安全技术揭秘系列】探索图片隐写的奥秘

    什么是隐写?由于我们识别声音或图片的能力有限,因此稍微改动信息的某字节位的数据是不会影响我们识别声音或图片的.举个最通俗的例子,古人的藏头诗就是隐写的一种方式: 而CTF图片隐写术就是利用图片来隐藏一 ...

  8. 由一道简单的图片隐写题总结思路

    题目来源:BUU [WUSTCTF2020]find_me 已我的经验拿到杂项图片题一般这个思路(以后自己变强了再补充): 右键看属性有无提示. binwalk分析文件是否隐写入其他文件有则forem ...

  9. 网络安全培训小白入门课,从buu到红帽的图片隐写

    图片隐写是MISC中的一部分,雨笋教育小编给小白从BUU中找到入门MISC之图片隐写,分享给大家 恢复黑白图片 buuoj 静静听这么好听的歌 由于网上wp只给了代码而且函数非常吓人,因此写了一个新手 ...

最新文章

  1. 【组队学习】十月组队学习内容详情!(第30期)
  2. 使用Netty实现的一个简单HTTP服务器
  3. subprocess 模块
  4. Jquery radio选中
  5. Android Material Design TabLayout属性app:tabMode和app: tabGravity
  6. Java 8 新特性之Stream API
  7. 2018-2019-2-20175225 实验四《Android开发基础》实验报告
  8. c语言编写弹窗提示是否确认退出_弹窗设计的5条基本原则
  9. python IDE 集合
  10. 【C#】Skip和Tack方法实现分页
  11. memset初始化值的效率秒杀for循环
  12. Sql2000数据库的备份文件恢复到Sql2005的方法
  13. 基于Linux利用PPP实现4G模块联网
  14. 硕士论文latex参考文献格式经验
  15. SCHMIDT SS 20.260 506690传感器ALRE JTF-1/12湿度检测器
  16. PTT BBS-- 软件人的心路历程分享 (补习计算机、学习写程序、出书、出国、求职...这位前辈都经历过了)...
  17. 计算机硬盘应该什么格式化,磁盘格式化是什么意思?快速格式化和一般格式化有什么区别...
  18. 深入理解Plasma(四)Plasma Cash
  19. JavaSE Lambda 表达式
  20. 手把手教你如何在广交会使用OBS直播丨汇信外贸软件

热门文章

  1. 基础:CSS3选择器详解
  2. Python扫码登录保存和验证cookies值——网易云音乐篇(九)
  3. C++: explicit的适用场合以及为什么要使用explicit
  4. 22-3-16Java冒泡排序
  5. Spring框架——IOC、DI
  6. from_unixtime()与UNIX_TIMESTAMP
  7. Android View - RemoteViews
  8. mongodb关联查询
  9. vb.net与SQL Server
  10. kaggle中的房价预测的一些数据分析方法详解