黑客经常用到的一个技术手段,你会用吗?
Posted 代码熬夜敲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑客经常用到的一个技术手段,你会用吗?相关的知识,希望对你有一定的参考价值。
大家好,我是周杰伦,今天跟大家聊聊图片隐写技术。
图片隐写技术是黑客们经常用到的一个技术手段,通常用于数据窃密的场景。
通过把数据信息隐藏到一张正常的图片中,实现数据的传输的目的,而图片看上去没有任何不同,甚至连图片大小可能都没有发生变化。
这有点类似于我们平时看到的谍战片中,把信纸通过特殊药水浸泡后才出现内容的场景。
如果我们将一张图片不断放大,会发现图片实际上是由一个又一个的小格子组成,在计算机中,每一个格子称作一个像素,每一个像素可以使用RGB颜色数值(0-255)来表示,而通过存储数字矩阵就能将图片存储在计算机中。
我们通常说一张图片的分辨率是1024*768,实际上是说这张图片是由1024行,768列像素构成。
隐写原理
由于人眼的感知误差,如果一部分像素值发生一些轻微的变化,我们肉眼基本是看不出来的。
基于这个原理,如果可以通过一定的编解码算法,将要隐藏的数据映射成对像素的修改,就能实现图片隐写。
下面介绍一个最简单的方法:
我们知道,在计算机中,所有数据都是二进制的形式在进行存储。
比如说十进制数据253对应的二进制数据是1111 1101,我们只需要把要隐藏的数据转换成二进制比特流,然后同时遍历图像中的每一个像素值和这一串比特流,将每一个像素的色值的最后一个二进制位改写成比特流中的二进制位。
举个例子:
要隐藏是二进制数据流:1 0
图像像素值:252 187
图像像素值二进制:1111100 10111011
隐写后的像素值二进制:11111101 10111010
隐写后的像素值:253 186
前面说过,因为人肉眼的敏感度问题,图像色值偏差很小的时候,除非你有过人的超能力视力,否则是难以察觉的。
实现
有了思路,接下来咱们来具体实现一下。
我们选择使用Python来实现,Python拥有丰富的库,图像处理当然也囊括其中。(PS:搞安全的同学一定要学一点Python,用来写个小工具啥的非常有用)
# -*- coding: utf-8 -*-
from PIL import Image as im
import re
replace_reg = re.compile(r'[1|0]$')
# 替换最后一位的数据,source是被替换数据,target是目标数据,就是batarget放到source最后一位
def repLstBit(source, target):
return replace_reg.sub(target, source)
# 运行结果:'123X'
print(repLstBit("111110", "1"))
# 字符串转换二进制,不够八位的话补齐8位
def encode(s):
return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in s)
# 切割从图像中收集到的数据,就是把载密图像的对应最后一位提取出来之后需要进行切割
def cut_text(text, lenth):
textArr = re.findall('.' + str(lenth) + '', text)
tempStr = text[(len(textArr) * lenth):]
if len(tempStr) != 0:
textArr.append(text[(len(textArr) * lenth):])
return textArr
# 二进制转换成字符串,看上面切割方法的注释即可理解该方法存在的意义
def decode(s):
bitArr = cut_text(s, 8)
return "".join(chr(int(i, 2)) for i in bitArr)
# 读取宿主图像和要写入的信息生成载密图像。
if __name__ == '__main__':
img = im.open("/Users/xiaobai/Desktop/origin.png")
width = img.size[0]
height = img.size[1]
hideInfo = "欢迎关注公众号:小白学黑客"
hideBitArr = encode(hideInfo)
count = 0
bitInfoLen = len(hideBitArr)
print(hideBitArr)
for i in range(width):
for j in range(height):
if count == bitInfoLen:
break
pixel = img.getpixel((i, j))
print(pixel[0])
sourceBit = bin(pixel[0])[2:]
print(sourceBit)
rspBit = int(repLstBit(sourceBit, hideBitArr[count]), 2)
count += 1
img.putpixel((i, j), (rspBit, rspBit, rspBit))
img.save("/Users/xiaobai/Desktop/hide.png")
来看一下原图:
执行程序以后,这是隐写数据之后的图,你能看出区别吗?
本文只是图片隐写技术最简单的一个示例,黑客们真正使用的算法会比这复杂的多,而他们的手法更隐秘也难以捕捉,相对破译的难度也更大。
以上是关于黑客经常用到的一个技术手段,你会用吗?的主要内容,如果未能解决你的问题,请参考以下文章