信息隐藏实践—图片隐写

admin 2022年9月30日10:23:31CTF专场评论14 views1757字阅读5分51秒阅读模式

    上篇文章给大家简单讲了一下信息隐藏的概念,但概念再怎么简单讲也是枯燥无味。毛泽东同志也说过,实践出真知。只有实践过,才能理解如何利用信息隐藏技术隐藏信息和理解信息隐藏的原理。


信息隐藏实践—图片隐写
LSB图片隐写原理


    上篇文章提到了一种常见的方式图像隐写,是利用LSB来进行隐写,LSB也就是最低有效位 (Least Significant Bit)。那什么又是最低有效位呢?这就有必要了解一下图片的组成原理。

    首先来简单说一下图片的组成,图片中的像数一般是由三种颜色组成,即三原色,由这三种原色可以组成其他各种颜色,例如在PNG图片的储存中,每个颜色会有8bit。

    LSB隐写就是修改了像数中的最低的1bit,在人眼看来是看不出来区别的,也把信息隐藏起来了。

信息隐藏实践—图片隐写

红色通道最后一位被修改


    譬如我们想把’A’隐藏进来的话,如这图,就可以把A转成16进制的0x61再转成二进制的01100001,再修改为红色通道的最低位为这些二进制串。


信息隐藏实践—图片隐写

每个通道都修改最后一位,修改8次就能隐藏一个ASCii码


信息隐藏实践—图片隐写
LSB图片隐写实践


    这里先挑选一张图片,和要隐藏的信息“dxctsk”。

信息隐藏实践—图片隐写

原图

使用python将信息隐藏到原图里面,可得加工后的图片

信息隐藏实践—图片隐写

处理后的图片

肉眼无法识别与原图的区别,使用工具查看隐写的信息

信息隐藏实践—图片隐写

可以看到照片中隐含了一段信息,下面附上LSB隐写源码,供参考。

# -*- coding: UTF-8 -*-


from PIL import Image

def plus(str):

    return str.zfill(8)

def get_key(strr):

#获取要隐藏的文件内容

    tmp = strr

    f= open(tmp,"rb")

    str = ""

    s = f.read()

    for i in range(len(s)):


        str = str+plus(bin((s[i])).replace('0b',''))


    f.closed

    return str


def mod(x,y):

    return x%y;


def func(str1,str2,str3):

    im = Image.open(str1)

     #获取图片的宽和高

    width = im.size[0]

    print ("width:"+str(width)+"n")

    height = im.size[1]

    print ("height:"+str(height)+"n")

    count = 0

    #获取需要隐藏的信息

    key = get_key(str2)

    keylen = len(key)


    for h in range(0,height):

        for w in range(0,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)

old = "D:\LSB\lena.png"

new = "D:\LSB\result.png"

enc = "D:\LSB\123.txt"

func(old,enc,new)

print ("图片隐写结束")



原文始发于微信公众号(SK安全实验室):信息隐藏实践—图片隐写

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月30日10:23:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  信息隐藏实践—图片隐写 http://cn-sec.com/archives/1038921.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: