文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用Python实现最低有效位隐写术?

2024-12-10 16:43

关注

 隐写术是一门关于在适当的多媒体载体中传输秘密数据的科学,例如在图像、音频和视频文件中。它的假设是,如果特征是可见的,那么攻击点就是明显的,因此这里的目标总是隐藏嵌入数据的存在。

[[343509]]

 

LSB图像隐写术

LSB隐写术是一种图像隐写术技术,通过用要隐藏的信息位替换每个像素的最低有效位,将信息隐藏在图像中。为了更好地理解,将数字图像视为2D像素阵列,每个像素包含的值取决于其类型和深度。

我们将考虑最广泛使用的模式——RGB(3×8位像素,真彩)和RGBA(4x8位像素,带透明遮罩的真彩),这些值的范围从0到255(8位值)。

 

将图像表示为2D阵列的RGB像素

通过使用ASCII表,可以将消息转换为十进制值,然后转换为二进制值,接着逐个迭代像素值,在将像素值转换为二进制后,将每个最低有效位替换为序列中的该消息位。

要解码一个已编码的图像,只需颠倒这个过程:收集并存储每个像素的最后一位,将它们分成8个一组,并将其转换回ASCII字符,以得到隐藏的信息。

 

PYTHON操作

试着使用Python库PIL和NumPY来逐步实现上述概念。

 

  1. import numpy as np 
  2. from PIL import Image 

首先,编写代码,将源图像转换成一个NumPy像素阵列,并存储图像的大小。检查图像的模式是RGB还是RGBA,然后设置n的值。还需计算像素的总数。

 

  1. def Encode(src, message, dest): 
  2.     img = Image.open(src, 'r'
  3.     width, height = img.size    array = np.array(list(img.getdata())) 
  4.     if img.mode == 'RGB'
  5.         n = 3 
  6.         m = 0 
  7.     elif img.mode == 'RGBA'
  8.         n = 4 
  9.         m = 1 
  10.     total_pixels = array.size//n 

其次,在秘密消息的末尾添加一个分隔符(“$T3G0”),这样程序在解码时就知道什么时候该停止,将这个更新后的消息转换成二进制形式,并计算出所需的像素。

 

  1. message += "$t3g0" 
  2. b_message = ''.join([format(ord(i), "08b"for i in message]) 
  3. req_pixels = len(b_message) 

接着,检查可用的总像素是否足够用于秘密消息。如果继续逐个迭代像素,并将它们的最低有效位修改为秘密消息的位,直到包括分隔符的完整消息已经被隐藏。

 

  1. if req_pixels > total_pixels: 
  2.     print("ERROR: Need larger filesize")else:    index=0    for p in range(total_pixels): 
  3.         for q in range(m, n): 
  4.             if index < req_pixels: 
  5.                 array[p][q] =int(bin(array[p][q])[2:9] + b_message[index], 2) 
  6.                 index += 1 

最后,有了更新后的像素数组,可以使用它来创建并保存为目标输出图像。

 

  1. array=array.reshape(height, width, n) 
  2. enc_img = Image.fromarray(array.astype('uint8'), img.mode) 
  3. enc_img.save(dest)print("Image Encoded Successfully"

这样,编码器功能就完成了,是这样的:

 

  1. def Encode(src, message, dest): 
  2.     img = Image.open(src, 'r')    width, height = img.size    array = np.array(list(img.getdata()))    if img.mode == 'RGB':        n = 3        m = 0    elif img.mode == 'RGBA':        n = 4        m = 1    total_pixels = array.size//n 
  3.     message += "$t3g0" 
  4.     b_message = ''.join([format(ord(i),"08b"for i in message]) 
  5.     req_pixels = len(b_message) 
  6.     if req_pixels > total_pixels: 
  7.         print("ERROR: Need largerfile size")    else:        index=0        for p in range(total_pixels): 
  8.             for q in range(m, n): 
  9.                 if index < req_pixels: 
  10.                     array[p][q] =int(bin(array[p][q])[2:9] + b_message[index], 2) 
  11.                     index += 1 
  12.         array=array.reshape(height,width, n) 
  13.         enc_img =Image.fromarray(array.astype('uint8'), img.mode) 
  14.         enc_img.save(dest)        print("Image EncodedSuccessfully"

首先,重复类似的步骤,将源图像的像素保存为一个数组,计算模式,并计算总像素。

 

  1. def Decode(src): 
  2.     img = Image.open(src, 'r'
  3.     array = np.array(list(img.getdata())) 
  4.     if img.mode == 'RGB'
  5.         n = 3 
  6.         m = 0 
  7.     elif img.mode == 'RGBA'
  8.         n = 4 
  9.         m = 1 
  10.     total_pixels = array.size//n 

其次,需要从图像左上角开始的每个像素中提取最低有效位,并以8个为一组存储。接下来,将这些组转换成ASCII字符来查找隐藏的消息,直到完全读取之前插入的分隔符。

 

  1. hidden_bits = "" 
  2. for p in range(total_pixels): 
  3.     for q in range(m, n): 
  4.         hidden_bits +=(bin(array[p][q])[2:][-1]) 
  5. hidden_bits = [hidden_bits[i:i+8] for i in range(0, len(hidden_bits), 8)] 
  6. message = "" 
  7. for i in range(len(hidden_bits)): 
  8.     if message[-5:] == "$t3g0"
  9.         break 
  10.     else
  11.         message +=chr(int(hidden_bits[i], 2)) 

最后,检查是否找到了分隔符。如果没有,意味着图像中没有隐藏的信息。

 

  1. if "$t3g0" in message: 
  2.     print("Hidden Message:",message[:-5]) 
  3. else
  4.     print("No Hidden MessageFound"

这样,我们的解码器功能就完成了,看起来应该是这样的:

 

  1. def Decode(src): 
  2.     img = Image.open(src, 'r')    array = np.array(list(img.getdata()))    if img.mode == 'RGB':        n = 3        m = 0    elif img.mode == 'RGBA':        n = 4        m = 1    total_pixels = array.size//n 
  3.     hidden_bits = "" 
  4.     for p in range(total_pixels): 
  5.         for q in range(m, n): 
  6.             hidden_bits +=(bin(array[p][q])[2:][-1]) 
  7.     hidden_bits = [hidden_bits[i:i+8] fori in range(0, len(hidden_bits), 8)] 
  8.     message = "" 
  9.     for i in range(len(hidden_bits)): 
  10.         if message[-5:] =="$t3g0":            break        else:            message +=chr(int(hidden_bits[i], 2))    if "$t3g0" in message:        print("Hidden Message:",message[:-5])    else:        print("No Hidden MessageFound"

对于主要功能,我们需询问用户想要执行哪个功能——编码还是解码。

若是编码,则要求用户输入以下内容——带扩展名的源图像名称、秘密消息和带扩展名的目标图像名称。若是解码,则要求用户提供隐藏了消息的源图像。

 

  1. def Stego(): 
  2.     print("--Welcome to$t3g0--"
  3.     print("1: Encode"
  4.     print("2: Decode"
  5.     func = input() 
  6.     if func == '1'
  7.         print("Enter Source ImagePath"
  8.         src = input() 
  9.         print("Enter Message toHide"
  10.         message = input() 
  11.         print("Enter Destination ImagePath"
  12.         dest = input() 
  13.         print("Encoding..."
  14.         Encode(src, message, dest)    elif func == '2'
  15.         print("Enter Source ImagePath"
  16.         src = input() 
  17.         print("Decoding..."
  18.         Decode(src)    else
  19.         print("ERROR: Invalid optionchosen"

请注意,在一项研究中,观察到传统的LSB在JPEG的情况下是无效的,因为数据会因为其有损性质而在压缩时被操纵。而对于PNG图像,简单的LSB是适用的,在压缩时不会有任何数据损失。因此,最好只在PNG图像上运行你的程序。

 

举例

 

编码信息

 

 

解码信息

 

 

 

 

 

来源:读芯术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯