图片魔术

今天给大家变个小魔术。鄙人不才,师承谦哥,给大家献丑了。

我左手拿着一张图片,右手握着一只鼠标。

看清楚了哦,不能眨眼,一起来见证奇迹!我轻轻地这么一点,嗖的一下。

这是什么鬼魔术嗷,放了两张一样的图片糊弄观众?

非也,非也。这是两张看起来相同实际上并不相同的图片。在这第二张图片里面,我嵌入了一段秘密信息,也就是神秘的隐写术

隐写方法及其应用曾出现在许多古代东西方的文字记载之中。

《Histories》最早描述了隐写的应用,其中记载,Histiaeus将消息刺在奴隶的头皮上,等到头发长出来再将奴隶送出去。

利用头发这个掩体传递密文,而本文所表演的魔术不过是把掩体换成了图片而已,使用了一种称为最低有效位(LSB)的算法。

我们知道图像像素的样点存在最低意义的比特位,比方说某个像素点为(255,255,255),用二进制表示就是每个颜色通道的数值都是11111111,最低意义的比特位就是这最后一位1,由于自然信号样点的奇偶性随机,对它们的修改是很难被人肉眼所感知的。比方说像素254和255仅在最低位不同,其差别是相当小的。

LSB算法正是通过修改这个最低有效位来达到传递密文的目的。

隐写不仅需要发出方将信息藏进载体里,接收方需要正确从这个藏了信息的载体里提取出信息。LSB算法也是如此,可以分成两部分来看待,嵌入算法以及提取算法

嵌入算法的主要做法是提取原始图片的像素,将其每个像素点最低有效位全部置零。将需要嵌入的秘密信息转换成二进制存储,并以此依次修改原图的像素。下面是嵌入算法的主要代码,其中主要依靠 PIL 库来进行图片的操作处理。

def func(str1,str2,str3):  
    im = Image.open(str1) 
    #获取图片的宽和高
    width,height= im.size[0],im.size[1]
    print("width:"+str(width))
    print("height:"+str(height))
    count = 0
    #获取需要隐藏的信息 
    key = get_key(str2) 
    keylen = len(key)
    for h in range(height):
        for w in range(width):
            pixel = im.getpixel((w,h))
            a=pixel[0]
            b=pixel[1]
            c=pixel[2]
            if count == keylen:
                break
            a= a-mod(a,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c)) 
                break
            b =b-mod(b,2)+int(key[count])
            count+=1 
            if count == keylen:
                im.putpixel((w,h),(a,b,c)) 
                break
            c= c-mod(c,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            if count % 3 == 0:
                im.putpixel((w,h),(a,b,c))
    im.save(str3)

而提取算法恰好与嵌入算法对应,你在最低位嵌入,我就只要把新图片的最低位提取出来,把二进制数据转换成十进制再转换成字符串即可。

本文分享自微信公众号 - 算法与数据之美(algo_and_data)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kubernetes 学习总结(3) M

    APIserver符合RESTful风格,支持GET/PUT/DELETE/POST等各种操作。所以也支持kubectl通过一系列命令对各处资源进行管理控制。 ...

    用户2398817
  • wordpress markdown 书写代码高亮插件

    我想,大家已经可以看到本站代码框中的效果了。这是使用了一个名为 WP Code Highlight 的插件。因为我自己的环境比较特殊,虽然 wordpress ...

    我与梦想有个约会
  • python中的矩阵运算

    转自:https://www.cnblogs.com/chamie/p/4870078.html

    用户2398817
  • python3 如何去除字符串中不想要的

          "Zhào Qián Sūn Lǐ Zhōu Wú Zhèng Wáng" 

    用户2398817
  • Python3 TKinter Plac

    用户2398817
  • ansible python api 2

     最近想利用python来调用anbile来实现一些功能,发现ansible的api已经升级到了2.0,使用上比以前复杂了许多。

    用户2398817
  • python http post 登

    http://uugoc.com/tools/ssc_ajax.ashx?A=Login&S=uugc&U=739639550

    用户2398817
  • python判断字符串或者集合是否为空

    最近在看《Effective Python》,里面提到判断字符串或者集合是否为空的原则,原文如下:

    用户2398817
  • ASP.NET MVC 3中ViewBa

    ViewBag, ViewData十分类似,都可用于把数据从controller传递到view。

    用户2398817
  • A Tour of Go: Basics

    Slices的概念与Python中的概念类似,是Array的子集。 slice只是数组的引用,因此修改slice值就是修改数组里的值。 []int{1,2,3}...

    用户2398817

扫码关注云+社区

领取腾讯云代金券