Steganograhy:第1部分
#编程 #教程 #python #steganography

欢迎在有关隐肌术的一系列文章中获得第一篇。我发现的东西既迷人又奇怪地利用了。如果您正在阅读本文,则可能会对它是什么有所了解,但是以防万一,这是数字上下文中的简短描述。

隐志是在另一个消息或物理对象中表示信息的做法,以使信息的存在对人类检查不明显。

在广泛的水平上确实很简单。您要采取想要隐藏的东西(目标),另一个消息/图像(封面)并操纵封面材料,以使原件可检索但不可见。。

有许多应用程序,例如监视资产通过系统,标记资产,向人们发送编码消息,甚至嵌入元数据,以免被自动化流程剥离。

有多种方法可以实现这一目标,但是主要的方法和本文我将重点的一种方法称为LSB(最不重要的位)。在这里,您可以将封面图像的像素值列出,并将最小有意义的位从目标图像中进行“存储”数据(一次)。这是一个快速的python示例,可以在图像中隐藏一些文本:

from PIL import Image

def encode():
    start = '#####'
    stop = '*****'
    full = start + 'Some string that you want to encode into an image' + stop

    binary_text = ''.join('{0:08b}'.format(ord(x), 'b') for x in full)
    print(binary_text, len(binary_text))

    with Image.open("file.png") as im:
        i = 0
        w, h = im.size

        for x in range(0, w):
            for y in range(0, h):
                if i >= len(binary_text):
                    i = 0

                bit = binary_text[i]
                pixel = im.getpixel((x, y))

                if bit == "0":
                    # Is odd, should be even.
                    if pixel[0] % 2 != 0:
                        new_pix = (pixel[0] - 1, pixel[1], pixel[2])
                        im.putpixel((x, y), new_pix)
                else:
                    # Is even, should be odd.
                    if pixel[0] % 2 == 0:
                        new_pix = (pixel[0] - 1, pixel[1], pixel[2])
                        im.putpixel((x, y), new_pix)

                i += 1

        im.save("file_enc.png")

这样,您将一些文本转换为文本的字符串二进制表示,循环通过 pixel并更改红色值(哪种颜色大多是任意的,红色通常是在拆分时首先出现的像素数据)以匹配二进制值。这将遍历整个图像,循环遍历二进制文本,然后将其编码到图像中。这可能对您来说是过分的,但它提供了基本的前提。

ðâ
请注意使用开始和停止字符串。这在完整循环中编码时很重要,因为没有它,您将不知道实际字符串的编码位置。这对于以后的鲁棒性也非常有用。

解码/检索部分只是相反。获取像素值,从红色像素值的LSB重建二进制字符串,然后将其转换回标准字符串。

def decode():
    start = '#####'
    stop = '*****'
    binary_stop = ''.join('{0:08b}'.format(ord(x), 'b') for x in stop)

    with Image.open("file_enc.png") as im:
        w, h = im.size
        binary_text = ''

        for x in range(0, w):
            for y in range(0, h):
                pixel = im.getpixel((x, y))

                if binary_text.endswith(binary_stop):
                    message = "".join([chr(int("".join(binary_text[i:i + 8]), 2)) for i in
                                       range(0, len(binary_text) - 8, 8)])

                    start_point = message.find(start) + len(start)
                    end = message.find(stop)
                    message = message[start_point:end]
                    return message

                if pixel[0] % 2 != 0:
                    binary_text += '1'
                else:
                    binary_text += '0'

正如我所说,这是一个非常简单的实现。它是按行完成的,在图像中逐列,并在整个图像上重复,因此不是很健壮。这也是最常见的形式,因此根本不抵抗stemanlysis。

这就是全部。现在,以上不是性能,它可以得到改进,但应该为开始在您的应用中实现隐形功能提供良好的基础。

可以在我的gitlab上找到一个完整的工作示例,这里:https://gitlab.com/Vapourisation/steganography_python_example

标题图片由Unsplash上的Unsplash

提供