内容安全实验信息隐藏技术
使用位图法修改BMP图像隐藏信息
我们先了解一下BMP图像的信息
bmp图像文件头和图像信息表
位图法隐藏和传递信息
(1)本机首先将要隐藏和传递的原始信息记录下来 abc 。
(2)对原始信息进行编码转换,如果要传输中文,打开汉字Unicode编码表,按照对应规则将它们转换为十六进制代码,再转换为二进制代码;如果要传输英文,打开ASCII码对照表,按照对应规则将它们转换为十六进制代码,再转换为二进制代码。
61 62 63 H
请将转换完成的信息代码(二进制代码)记录在这里 0110 0001 0110 0010 0110 0011 。
原始信息长度是 3 个字符,这个长度的二进制值是 0000 0011 。
原始信息文字类型(即文件标识符英文为00中文为01) 00 ,
其二进制值是 0000 0000 。
(3)将原始信息长度代码和文字类型代码追加至原始信息中,然后利用位图法修改BMP图像对应的位,完成信息嵌入工作,具体操作如下:
使用UltraEdit打开图片pic1,找到图像数据区的开始位置。利用位图法修改BMP图像,将转换后的信息长度代码和信息代码嵌入到BMP图片中,并观察图像视觉上是否有变化。
0070开始是图像数据区,从这里插入隐藏数据。
要隐藏的数据为0000 0000 0000 0011 0110 0001 0110 0010 0110 0011 40位2进制
位图法修改BMP图像隐藏信息算法原理
设要隐藏的数据是 0 (一位)
图像的数据区的数据是 02 = 0000 0010
我们对图像的数据 0000 0010 进行奇偶校验 ,有1个1,为奇。可以设置其为1
我们要隐藏的数据为0,我们需要修改图像的数据 (0000 0010)使得它的奇偶校验为偶即0
我们修改最后一位,把它置为相反的值为0000 0011 这样奇偶校验就为偶了,与我们要隐藏的信息一致。
最后16进制的值为 03 我们把原来图像的02改成03
位图法隐藏python算法
#要隐藏的数据为0000 0000 0000 0011 0110 0001 0110 0010 0110 0011
#源数据 original 放置 70h和c0h数据
original="020500010500010500000400000400000400000400010200010200010200010200010100010100000100000100000100000100000100000100000102000100000400000400000300000300000300000300000400000400010500010500010500"
grouped = [original[i:i+2] for i in range(0, len(original), 2)]
print(grouped[0])
hint="0000000000000011011000010110001001100011"
print(hint)
RE=[]
def parity_check(data):
# 计算数据中1的个数
count = 0
for bit in data:
if bit == '1':
count += 1
# 判断奇偶性
if count % 2 == 0:
return 0 #偶校验
else:
return 1 #奇校验
def hex_to_binary(hex_string):
binary_string = bin(int(hex_string, 16))[2:]
return binary_string.zfill(len(hex_string) * 4)
def invert_lowest_bit(binary_string):
binary_list = list(binary_string) # 将二进制字符串转换为列表
binary_list[-1] = '1' if binary_list[-1] == '0' else '0' # 取反最低比特位
inverted_binary = "".join(binary_list) # 将列表转换回二进制字符串
return inverted_binary
def binary_to_hex(binary_string):
hex_string = format(int(binary_string, 2), '0' + str(len(binary_string) // 4) + 'X')
return hex_string
for i in range(0,len(hint)):
print("要隐藏的二进制hint[i]:",hint[i])
hex_num = grouped[i]
print("原数据的值",hex_num)
binary_num = hex_to_binary(hex_num)
print("转换为2进制",binary_num)
result = parity_check(binary_num)
print("奇偶校验结果:",result)
if int(result)==int(hint[i]):
print("奇偶相同不用改变",result,hint[i])
print("隐藏信息后十六进制:",hex_num)
RE.append(hex_num)
else:
print("奇偶不相同改变最后一位", result, hint[i])
inverted_num = invert_lowest_bit(binary_num) #改变最后一位
print("改变奇偶后二进制",inverted_num)
result2 = parity_check(inverted_num)
if int(result2)==int(hint[i]):
print("奇偶相同不用改变",result2,hint[i])
hex_num = binary_to_hex(inverted_num)
print("改变奇偶后十六进制:",hex_num)
RE.append(hex_num) # 将 hex_num 添加到 RE 列表中
print(RE)
RE2=[]
hint2 = ""
def extract_information(RE):#提取信息函数
global hint2 # 声明hint2为全局变量
for i in range(0,len(RE)):
binary_num = hex_to_binary(RE[i])
RE2.append(binary_num)
result=parity_check(binary_num)
hint2=hint2+str(result)
return hint2
hint2=extract_information(RE)
print(RE2)
print("提取信息值hint2:",hint2)
print("对比隐藏信息值hint",hint)
得到隐藏信息后的十六进制串:
['03', '05', '00', '00', '05', '00', '00', '05', '00', '00', '05', '00', '00', '05', '01', '01', '05', '01', '01', '05', '00', '00', '03', '01', '00', '02', '01', '00', '03', '00', '01', '03', '00', '01', '01', '00', '00', '00', '01', '01']
修改后的图像
图像对比
隐藏信息前:
隐藏信息后:
可以看出没有什么明显的差异 ,信息隐藏成功
信息提取代码
def extract_information(RE):#提取信息函数
global hint2 # 声明hint2为全局变量
for i in range(0,len(RE)):
binary_num = hex_to_binary(RE[i])
RE2.append(binary_num)
result=parity_check(binary_num)
hint2=hint2+str(result)
return hint2
参考文献:
http://t.csdnimg.cn/t35Tf
http://t.csdnimg.cn/ZyeYb