千家信息网

怎么使用Python实现最低有效位隐写术

发表于:2026-10-30 作者:千家信息网编辑
千家信息网最后更新 2026年10月30日,这篇文章主要讲解了"怎么使用Python实现最低有效位隐写术",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么使用Python实现最低有效位隐写术"吧
千家信息网最后更新 2026年10月30日怎么使用Python实现最低有效位隐写术

这篇文章主要讲解了"怎么使用Python实现最低有效位隐写术",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么使用Python实现最低有效位隐写术"吧!

LSB图像隐写术

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

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

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

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

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

PYTHON操作

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

  • 步骤1:导入所有必需的python库

import numpy as np from PIL import Image
  • 步骤2:启用编码器功能

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

def Encode(src, message, dest):     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

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

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

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

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

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

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

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

def Encode(src, message, dest):     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     message += "$t3g0"     b_message = ''.join([format(ord(i),"08b") for i in message])     req_pixels = len(b_message)     if req_pixels > total_pixels:         print("ERROR: Need largerfile size")    else:        index=0        for p in range(total_pixels):             for q in range(m, n):                 if index < req_pixels:                     array[p][q] =int(bin(array[p][q])[2:9] + b_message[index], 2)                     index += 1         array=array.reshape(height,width, n)         enc_img =Image.fromarray(array.astype('uint8'), img.mode)         enc_img.save(dest)        print("Image EncodedSuccessfully")
  • 步骤3:启用解码器功能

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

def Decode(src):     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

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

hidden_bits = "" for p in range(total_pixels):     for q in range(m, n):         hidden_bits +=(bin(array[p][q])[2:][-1]) hidden_bits = [hidden_bits[i:i+8] for i in range(0, len(hidden_bits), 8)] message = "" for i in range(len(hidden_bits)):     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")

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

def Decode(src):     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     hidden_bits = ""     for p in range(total_pixels):         for q in range(m, n):             hidden_bits +=(bin(array[p][q])[2:][-1])     hidden_bits = [hidden_bits[i:i+8] fori in range(0, len(hidden_bits), 8)]     message = ""     for i in range(len(hidden_bits)):         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")
  • 步骤4:制作主要功能

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

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

def Stego():     print("--Welcome to$t3g0--")     print("1: Encode")     print("2: Decode")     func = input()     if func == '1':         print("Enter Source ImagePath")         src = input()         print("Enter Message toHide")         message = input()         print("Enter Destination ImagePath")         dest = input()         print("Encoding...")         Encode(src, message, dest)    elif func == '2':         print("Enter Source ImagePath")         src = input()         print("Decoding...")         Decode(src)    else:         print("ERROR: Invalid optionchosen")
  • 步骤5:把以上所有功能放在一起,我们的LSB图像隐写程序就准备好了。

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

举例

1.编码信息

2.解码信息

感谢各位的阅读,以上就是"怎么使用Python实现最低有效位隐写术"的内容了,经过本文的学习后,相信大家对怎么使用Python实现最低有效位隐写术这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

像素 图像 消息 最低 有效 功能 信息 步骤 编码 分隔符 秘密 源图 二进制 内容 模式 用户 程序 阵列 存储 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 耶加雪菲 互联网科技网 中国互联网科技工作委员会毛军 互联网下的科技发展 互联网最新的科技有限公司 北京互联网科技公司 互联网科技公司电话 紫鲸互联网科技 海南科技产业互联网平台 北京华百购互联网科技有限公司 汽车互联网创新科技园 中国航天科技大学国际工业互联网 翼展科技 首家互联网医院 长沙茂晟互联网科技有限公司 区块链结合互联网科技 美国互联网科技实力 卡尔迅互联网科技有限公司 湖北辰鑫科技互联网 唐山双旺合互联网科技产业园 10位科技互联网大佬 互联网科技公司税收优惠 金融科技还是互联网 美国互联网黑科技 中国互联网金融科技基金 央行互联网金融科技公司 互联网金融中的现代科技 厦门比较好的科技互联网公司 广州市恰铎互联网科技有限公司 珠海东科互联网科技有限公司 科技发展第三阶段互联网时代
0