apache 报错信息隐藏_go ——文本拆分隐藏

0f00f04039f1b517f31b6597b0fc6cfe.png 点击菜单栏“粉丝福利” 拿小度,兑手机!
作者:谢瑞兆 来源:知乎人工智能学习圈

该项目源自某大学go语言作业e34726bfea8bdfaae86cea62d7a7a9e7.png

注:本文使用 go 1.8.3 下面的这个 Project.zip 包含
1.一份残缺的 hide.go 代码,其中有四个主要的功能函数需要填写
2.测试用图像(BMP格式)与测试用文本 https://pan.baidu.com/s/102Xx4Gjgejr5I64PM37w_A 声明:该程序的 _4byte2int 、GetPartsOfBmp 、HideInfo 、ShowInfo 是由本人编写的,其中 HideInfo 、ShowInfo 实现主要功能,其他部分由学校老师提供。

 7f77a54d8072ae26f30791eed22df0d0.gif

该程序的主要功能是将一段文本信息存储入一个图像,并能够完整地还原出原图像。
图像在隐藏文本信息之后文件大小不变,肉眼基本无法分辨隐藏前后的图像。
隐藏效率为1:4,即1byte的信息需要4byte的图像来隐藏。

1

实现原理

以 BMP 格式存储的图像是由一个个像素构成的,而每一个像素块又存储着RGB三种颜色。 单独的一个像素的一个颜色(如R)的大小是 8 位(0-255),即 1 byte。而如果我们对这 1 byte 的颜色进行微调,例如调整该色的最后 2 位,对于颜色的影响是极小的,而人眼基本无法分辨这种微小的颜色变化,例图如下: 2b18eca5b3f5de1235b774e29dedd0fc.png 所以,将一个字符(1 byte,8 bit)以 2bit 为一个单位,拆分为 4 份,反向存储(为了便于读取)于 4 个 RGB块 的最后 2bit ,即可完成隐藏。 435500cc4257a80259399ff6067f9cb3.png 一个需要注意的事实是,如果仅仅是简单地将文本信息以 1:4 的比例存入图像信息,在还原信息是会遭遇困难——程序不知道何时停止。因此,我们需要一个标识。在这个程序中,我使用的方法是在像素阵列开头存储一个固定长度的量(Interger,4 byte)——文本信息长度,在读取出该数值之后,程序就可以在隐藏信息结束的位置停下,并生成隐藏文本文件。 446ff3284e12bee80fda7033cc9844b7.png 需要注意,存储时应以小端存储,便于还原 BMP文件分为三个部分:file_header 、bmpinfo_header 、pixel_array。其中,第三部分即 pixel_array (像素阵列) 是信息隐藏的目标阵列。file_header 的长度是 14 byte ,bmpinfo_header 的长度是 40 byte。同时,bmpinfo_header 中存储着图像的 宽(width)高(height)信息,这些信息有可能有助于程序的构建。 f807254fa53da34737e6a613b2457728.png

2

程序实现

main函数 ed21d60bfd0bee60aed00222e61276f6.png 命令行参量 os.Args 用于获取用户输入的参数,需要注意的是 os.Args[0] 为文件路径。 在 main 函数中,依照用户输入的参数 hide 或者 show 分别执行 HideProcedure 或者ShowProcedure。 HideProcedure 需要传入的三个参数分别是src_img_path , hide_file_path , dest_img_path 即 源图像路径 、待隐藏文本路径 、隐藏完成的图像输出路径。 8523096cc76f41baa304c92c924fe8e8.png 该函数完成的是信息隐藏功能 ShowProcedure 需要传入的三个参数分别是 src_img_path , data_path
即 含隐藏信息的图像路径 、还原的文本信息路径 d15ae8762f469cac69e777e2d31696ee.png 该函数完成的是信息还原功能 _print_usage()函数 61add6afe6ac96dd1885bcd8fbd520ef.png 该函数用于 用户参数输入不足时的报错信息 014bf0e2535f1972bd6883818386eb00.png HideProcedure函数 d01757c164a1aa4b6d5643f00952e70f.png 该函数完成信息隐藏功能

第一行打印提示信息

第二行调用 GetPartsOfBmp 函数 将bmp图像切分为三个部分
file_header, bmpinfo_header, pixel_array

第三行调用 ReadAllFromFile 将 待隐藏的文本信息 读入 hide_data中

第四行调用 HideInfo 函数 将文本信息拆分隐藏入像素阵列中

第五行调用 ProduceImg 将 file_header , bmpinfo_header 和 新的像素阵列new_pixel_array 重新整合为 bmp 文件并输出到 dest_img_path

GetPartsOfBmp函数 055a43802e00d36a420b07e89a5f07ec.png 调用 ReadAllFromFile 函数 将 源图像信息 存入 alldata 依据bmp三个部分的大小,依次分为[0:14] [14:54] [54:] 最后一部分即是我们需要的像素阵列 需要注意的是,bmp文件可能包含一些在像素阵列之后的部分,即[54:]中可能包含非像素的部分,因此使用 [54:54+width * height * 3] 更加稳妥 ReadAllFromFile函数 2a57ebcf4801c8cfec68d6c06aeaa7c3.png 简单的文件读取函数 _4byte2int函数 de17d65dd7685f3649d61d213184eebc.png 将小端模式存储的4个byte还原为int 4232e670b6ca6569997ed5aa1a3f0d91.png HideInfo函数 e8f5a89c993f23a6993351a6ecdc682e.png e658cc65737355706131fdf71893e1f2.png 该语句将 一个像素的单个色块 右移2位,再左移两位,结果是清零了最低两位 0100 1011 >>2 0001 0010
0001 0010 <<2 0100 1000 直接相加可以得到新像素 文本信息隐藏类似 a3e7a1bc3aa0b12058fd6dfa518840b8.png 该语句是为了取出 hide_data[i-4] (1byte ,8bit)中的 5-6 位 ProduceImg函数 ff1a05b79697ba8aa2d83eb22f43bb72.png 重新合成图像并输出 ShowProcedure函数 e5ecc68ce67ccd93a82fdb47d239d253.png 与HideProcedure函数大致类似 一个区别是该函数不再需要file_header, bmpinfo_header部分,只保存了pixel_array ShowInfo函数 caeececf55053b98da2b5f8a4d5d99c4.png 41c25be24c7b912ebd48246699595fed.png WriteAllToFile函数 edfc35fdb0a8aa8198b930dee4fd09cc.png 将还原出的文本写入文件

3

运行示例

ab7251d936a2493fed4c87c97a44ee9f.png 可以看到还原出的文本与原文件大小相同,经检验内容也相同 01fd8d1a8b01073f6708bc11807637b3.png 两个图像用人眼难以辨别 00542c1c9cb02cadec2f3d739a112b33.png 4ce49e4469dde7b79116277cf1d3fed3.png 基本达成目标 附完整代码 01a81469ff63c12237197b549df4b660.png
原文链接: https://zhuanlan.zhihu.com/p/141339765
95d8b1077bc03693b57f6b0c3b565cd0.png b6d89a38472e35089b2812a0080b27df.png db77eb71d409e85279ad50bc1c61268f.png eff92caa4b726f46543d5c62c6a8e6a2.png d7012ae27ce4162ad6786f3ed7562d9f.png ee75db603a172720a29bc7630d16e1fa.png 59483ebf9d2022fc976c3c61ed0683f7.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值