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)