1. 程式人生 > >Python LSB圖片隱寫技術

Python LSB圖片隱寫技術

利用python的PIL函式提取各個畫素,例如(255,255,255),轉換成二進位制例如(1111111,1111111,1111111),修改後一位至兩位的話肉眼幾乎無法辨別。

把所想隱含的資訊轉換成二進位制ascall碼分別填入每個畫素的最後一位(可以是最後兩位,或者一個畫素每一種顏色都填入,在不影響的情況下隨意修改)

大概程式碼如下

原理很簡單,但其中最後生成的圖片只能是png格式,一開始jpg格式的圖片怎麼都不對,官方文件只用了png做栗子,所以這也算個缺陷吧。

MD浪費了我四個小時的PNG

from PIL import Image
import math
from operator import mod
import binascii
def takeInfo(url):
    hide = Image.open(url)
    c, d = hide.size
    sumx = []
    for i in range(0, c):
        for k in range(0, d):
            x = hide.getpixel((i, k))
            x = list(x)
            sumx.append(x)
    return sumx


def binToOct(s):
    count=len(s)-1
    var = 0
    for i in s:
        if(i=='1'):
            var = var + math.pow(2,count)
        count = count - 1
    return var


def makeInfo(myInfo,sum):  #1001010111
    s = ''
    s= str(s)
    for i in myInfo:
        i = bin(ord(i)).lstrip('0b')
        s = s + i
    s = list(s)
    count = 0
    for pix in sum:
        pix[2] = bin(pix[2])
        pix[2] = list(pix[2])
        pix[2][len(pix[2])-1] = s[count]
        sum[count][2] = int(binToOct(pix[2]))
        count = count + 1
        if(count == len(s)-1):
            break
    return sum


def makePic(sum,url,newUrlxxx):
    hide = Image.open(url)
    c, d = hide.size
    img = Image.new('RGB',(c,d))
    count = 0
    for i in range(0,c):
        for k in range(0,d):
            sum[count] = tuple(sum[count])
            img.putpixel((i,k),sum[count])
            count = count + 1
    img.save(newUrlxxx)
    sumx = takeInfo(newUrlxxx)


def decipher(url):
    sum = takeInfo(url)
    x = []
    x = list(x)
    count = 0
    for pix in sum:
        count = count + 1
        pix[2] = bin(pix[2]).lstrip('0b')
        x.append(pix[2][len(pix[2])-1])
        if(len(x)==7):
            var = int(binToOct(x))
            print chr(var)
            x = []
        if(count == 1400):
            break


def encrypt(info,oldImg,newImg):
    sum = takeInfo(oldImg)
    sum = makeInfo(info, sum)
    makePic(sum, oldImg, newUrlx)


if __name__=='__main__':
    imageUrl = "d:girl.jpg"
    newUrlx = "d:codeGirl.png"
    encrypt('ILoveYouSL',imageUrl,newUrlx)


    decipher(imageUrl)