图片文件隐写技术的原理与实现方法研究

目录

一、问题背景... 2

二、问题分析... 2

三、解决方案... 2

简单的隐藏方法:... 2

PNG图像隐写... 2

图片宽高调整... 3

JPG图片隐写... 3

EXIF信息... 4

BMP图片隐写... 4

GIF图片隐写... 4

盲水印... 4

LSB隐写... 4

工具... 4

Binwalk. 4

Foremost. 5

010Editor. 5

Stegsolve.jar. 5

OurSecret. 5

ARCHPR和Ziperello. 5

Zipcenop. 5

Exif. 5

Stegolve. 5

Zsteg. 5

Wbstego4工具... 6

TeakPNG.. 6

Bftools. 6

基于Pyhton的图像隐写术... 6

四、总结... 7

五、参考文献... 7

六、总结... 7

1.信息技术和个性化网络服务的飞速发展,使得人们越来越依赖于网络服务平台进行数据同步和共享。然而,这也带了用户个人数据被窃取的风险,对个人信息安全构成威胁。

2.图像作为信息的主要载体,其安全性尤为重要。传统的加密技术虽然能有效保护图像信息,但在某些情况下,隐写技术因其隐蔽性更高而更具优势。

3.隐写技术通过将待传输信息嵌入到图像中,借助载体来掩盖秘密信息的传输,从而达到保护信息安全的目的。

1.图片隐写是一种将信息隐藏在图片中的技术。通过修改图片的像素值,可以将需要隐藏的信息嵌入到图片中,而不会影响图片的正常显示。在提取信息时,可以通过相应的算法和工具提取出隐藏在像素值中的信息。

2.隐写技术的原理:通过改变载体(如图像)的某些特征(如像素值、颜色空间等),将秘密信息嵌入其中,同时保持载体的视觉质量不受影响或影响极小。

3.隐写技术的挑战:如何在保证嵌入信息量的同时,降低对载体视觉质量的影响;如何设计有效的隐写算法,以抵抗隐写分析技术的检测。

4.图片文件隐写技术的特点:利用图像文件的冗余信息(如颜色空间、像素值等)进行信息隐藏,具有隐蔽性好、嵌入容量大等优点。

各种不同格式的图像文件的头文件都不相同,解码编码方式也不相同,应针对不同的文件格式,应用不同的隐写技术方法

用记事本打开图片,可以在一群乱码的结尾写入信息。

PNG图像隐写

PNG图像格式文件由一个8字节的PNG文件标识域和3个以上的后续数据块如:IHDR、IDAT、IEND等组成

如:

89 50 4E 47 0D 0A 1A 0A

89:用于检测传输系统是否支持8位的字符编码,用以减少将文本文件被错误的识别成PNG文件的机会,反之亦然

50 4E 47:PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件

0D 0A:DOS风格的换行符,用于DOS-Unix数据的换行符转换

1A:在DOS命令行下,用于阻止文件显示的文件结束符

0A:Unix风格的换行符,用于Unix-DOS换行符的转换


↑此png图片的十六进制文件如下

通过对文件的十六进制数据直接修改,即可达到隐写信息的效果,此种方法隐蔽性高,如果不检查文件的十六进制数据,则几乎不能发现隐写的信息,

PNG文件中,每个数据块都由四个部分组成,如下:

长度(Length):指定数据块中数据区域的长度,长度不可超过(2^31-1)个字节

数据块类型码(Chunk Type Code):数据块类型码由ASCII字母(A-Z和a-z)组成的"数据块符号"

数据块数据(Chunk Data):存储数据块类型码指定的数据

循环冗余检测(CRC):存储用来检测是否文件传输有误的循环冗余码

对宽高进行修改:

结果图片变为 1px * 1px 大小

实现了图片其他区域信息的隐藏

JPG图片隐写

jpg图片的头数据为

FF D8 FF

jpg图片高度修改:

EXIF信息

在我们拍摄图片时,exif可以记录数码照片的属性信息和拍摄数据

右击图片,点击熟悉,选择详细信息,这里面可以看到图片拍摄的一些值,有时候还能找到经纬度

通过对EXIF信息的修改即可实现信息的隐藏

BMP图片隐写

BMP图片格式

BMP 文件格式能够存储单色和彩色的二维数字图像,具有各种颜色深度,并且可以选择使用数据压缩、alpha 通道和颜色配置文件

bmp的头文件数据为

42 4D

头数据后四位是图片大小

由于个人计算机都是以小端序,所以数据要从右往左写

0x002c268e == 2893454(Byte) == 2.75M

GIF图片隐写

gif图片是动图,它是由一帧一帧的图片拼接而成

gif头文件数据为

47 49 46 38 39 61

盲水印是一种肉眼不可见的水印方式,可以保持图片美观的同时,保护版权,隐藏式的水印是以数字数据的方式加入音频、图片或影片中,但在一般的状况下无法被看见

LSB隐写

lsb隐写题在ctf中也经常考到,LSB即为最低有效位,我们知道,图片中的图像像素一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,

LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,每个像数可以携带3比特的信息。

Binwalk是一款快速、易用,用于分析,逆向工程和提取固件映像的工具。

最直接的我们可以用来检测图片中是否有隐藏的文件。

foremost是一个控制台程序,用于根据页眉,页脚和内部数据结构恢复文件。

最直接的我们可以将图片中的隐藏文件拆分出来。

010 Editor 是一款专业的文本编辑器和十六进制编辑器,旨在快速轻松地编辑计算机上任何文件的内容。

            应用方法:

            1.修改图片的高度来查看隐藏信息

如图,00 00 03 9E代表宽 00 00 05 FF 代表高

我们把高度变大一点 就可以看到密码了

            2.查看压缩包是否是伪加密

50 4B 03 04:这是头文件标记(0x04034b50)

14 00:解压文件所需 pkware 版本

01 00:全局方式位标记(判断有无加密的重要标志)

08 00:压缩方式

5A 7E:最后修改文件时间

F7 46:最后修改文件日期

隐写图片查看的神器------stegsolve

OurSecret是一个图片解密的工具

ARCHPR和Ziperello

这两个工具都是用来爆破压缩包的。

专门用来破解伪加密的一个工具,非常好用。

使用ZipCenOp.jar(需要java环境),在cmd中使用

java -jar ZipCenOp.jar r xxx.zip

Exif按照JPEG的规格在JPEG中插入一些图像/数字相机的信息数据以及缩略图象,可以通过与JPEG兼容的互联网浏览器/图片浏览器/图像处理等一些软件来查看Exif格式的图像文件,就跟浏览通常的JPEG图像文件一样。

图片右键属性,查看exif或查看详细信息,在相关选项卡中查找flag信息。

当两张jpg图片外观、大小、像素都基本相同时,可以考虑进行综合分析,即将两个文件的像素RGB值进行XOR、ADD、SUB等操作,看能否得到有用的信息,StegSolve可以方便的进行这些操作。

Zsteg工具 检测LSB隐写

使用方式:zsteg xxx.png

这个工具在kali里面自带有,可以直接使用。

Wbstego4工具

解密通过lsb加密的图片

TweakPNG是一款简单易用的PNG图像浏览工具,它允许查看和修改一些PNG图像文件的元信息存储。

使用场景:文件头正常却无法打开文件,利用TweakPNG修改CRC。

Bftools用于解密图片信息

使用场景:在windows的cmd下,对加密过的图片进行解密

格式:

Bftools.exe decode braincopter 图片名字 --output 输出的文件名

Bftools.exe run 输出的文件名

bftools.exe decode braincopter 1.png --output 2.png

bftools.exe run 2.png

基于Pyhton的图像隐写术


from PIL import Image


# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):
    newd = []

    for i in data:
        newd.append(format(ord(i), '08b'))
    return newd


# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):
    datalist = genData(data)
    lendata = len(datalist)
    imdata = iter(pix)
    for i in range(lendata):
        pix = [value for value in imdata.__next__()[:3] +
               imdata.__next__()[:3] +
               imdata.__next__()[:3]]
        for j in range(0, 8):
            if (datalist[i][j] == '0' and pix[j] % 2 != 0):
                pix[j] -= 1
            elif (datalist[i][j] == '1' and pix[j] % 2 == 0):
                if (pix[j] != 0):
                    pix[j] -= 1
                else:
                    pix[j] += 1
                # pix[j] -= 1
                # Eighth pixel of every set tells
                # whether to stop ot read further.
                # 0 means keep reading; 1 means thec
                # message is over.
                if (i == lendata - 1):
                    if (pix[-1] % 2 == 0):
                        if (pix[-1] != 0):
                            pix[-1] -= 1
                        else:
                            pix[-1] += 1
                else:
                    if (pix[-1] % 2 != 0):
                        pix[-1] -= 1
                pix = tuple(pix)
                yield pix[0:3]
                yield pix[3:6]
                yield pix[6:9]


def encode_enc(newimg, data):
    w = newimg.size[0]
    (x, y) = (0, 0)

    for pixel in modPix(newimg.getdata(), data):
        newimg.putpixel((x, y), pixel)
    if (x == w - 1):
        x = 0
        y += 1
    else:
        x += 1


# Encode data into image
def encode():
    img = input("Enter image name(with extension) : ")
    image = Image.open(img, 'r')

    data = input("Enter data to be encoded : ")
    if (len(data) == 0):
        raise ValueError('Data is empty')

    newimg = image.copy()
    encode_enc(newimg, data)

    new_img_name = input("Enter the name of new image(with extension) : ")
    newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))


# Decode the data in the image
def decode():
    img = input("Enter image name(with extension) : ")
    image = Image.open(img, 'r')

    data = ''
    imgdata = iter(image.getdata())

    while (True):
        pixels = [value for value in imgdata.__next__()[:3] +
                  imgdata.__next__()[:3] +
                  imgdata.__next__()[:3]]

        binstr = ''
        for i in pixels[:8]:
            if (i % 2 == 0):
                binstr += '0'
            else:
                binstr += '1'
        data += chr(int(binstr, 2))
        if (pixels[-1] % 2 != 0):
            return data


# Main Function
def main():
    a = int(input(":: Welcome to Steganography ::\n"
                  "1. Encode\n2. Decode\n"))
    if (a == 1):
        encode()

    elif (a == 2):
        print("Decoded Word :  " + decode())
    else:
        raise Exception("Enter correct input")


if __name__ == '__main__':
    # Calling main function
    main()

图片文件隐写技术是一种有效的信息隐藏方法,通过改变图像文件的某些特征来嵌入秘密信息,同时保持图像的视觉质量不受影响或影响极小。

在选择和设计隐写算法时,需要综合考虑嵌入信息量、对载体视觉质量的影响以及抵抗隐写分析技术的能力等因素。

隐写技术的实现方法包括图像预处理、信息嵌入和隐写图像的输出与保存等步骤。在实际应用中,需要根据具体需求选择合适的隐写算法和实现方法。

基于Pyhton的图像隐写术--如何隐藏图像中的数据:https://zhuanlan.zhihu.com/p/322334101

CTF Misc(1)图片隐写基础以及原理:CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型_misc图片隐写-CSDN博客

<总结>CTF·图片隐写:​​​​​​<总结>CTF·图片隐写_图片隐写 ctf-CSDN博客

Hello-CTF: 针对0基础新手编写的CTF快速入门手册:隐写技术 - Hello CTF

渗透测试CTF-图片隐写的详细教:https://blog.csdn.net/qq_38612882/article/details/127647627?spm=1001.2014.3001.5502

本研究对图片文件隐写技术的原理与实现方法进行了深入探讨,指出了隐写技术在信息安全领域的重要应用价值。随着信息技术的不断发展,隐写技术将面临更多的挑战和机遇。未来研究可以进一步探索新型隐写算法和隐写分析技术,提高隐写技术的安全性和隐蔽性,以满足更高层次的信息安全需求。

七、附录

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值