資訊隱藏課程之簡單的LSB最低位隱寫
阿新 • • 發佈:2019-01-01
# -*- coding: utf-8 -*-
_author_ = 'xiao_lu' #取出RGB 值得 lsb 替換 import Image import matplotlib.pyplot as plt #得到加密文字的二進位制形式 def plus(str): return str.zfill(8) def get_key(): f = file("D:\\zip1.txt", "r") str = "" s = f.read() print s for i in range(len(s)): str=str+ plus(bin(ord(s[i])).replace('0b', '')) print str f.closed return str def mod(x,y): return x%y; if __name__ == '__main__': im = Image.open("d:/lena.jpg") plt.subplot(1, 2, 1), plt.title('origin') plt.imshow(im), plt.axis('off') width = im.size[0] height = im.size[1] count = 0 key = get_key() #得到 文字資訊 #如果嵌入的文字過多導致載體不夠大 if width*height*3<len(key): print "please change the image" exit() #基於最低位lsb嵌入 for h in range(0, height): for w in range(0, width): pixel = im.getpixel((w, h)) a = pixel[0]#R b = pixel[1]#G c = pixel[2]#B if count == len(key): break #LSB 嵌入過程 替換最後一位 if count%3==0: a= a-mod(a,2)+int(key[count]) elif count%3==1: b = b- mod(b, 2) + int(key[count]) else: c= c-mod(c,2)+int(key[count]) im.putpixel((w,h),(a,b,c)) count=count+1 if count == len(key):#全部潛入完畢 break plt.subplot(1, 2, 2), plt.title('now')#前後兩個圖片對比 plt.imshow(im), plt.axis('off') plt.show() im.save(r"d:/lena_rgb.bmp") print "success\n"
解密過程
# -*- coding: utf-8 -*- _author_ = 'xiao_lu' import Image def mod(x,y): return x%y; #將得到的二進位制串化成ASCII碼 def toasc(str): return int(str, 2) if __name__ == '__main__': a="" im = Image.open("d:/lena_rgb.bmp") f1 = file("D:\\zip1.txt", "r") s = f1.read() lenth = len(s) width = im.size[0] height = im.size[1] count = 0 #直接提取最後一位 基於rgb三個影象 for h in range(0, height): for w in range(0, width): pixel = im.getpixel((w, h)) if count ==lenth*8: break if count%3==0: a = a+str((mod(int(pixel[0]),2))) elif count%3==1: a=a+str((mod(int(pixel[1]), 2))) else: a=a+str((mod(int(pixel[2]), 2))) count+=1 if count == lenth*8: break print a#輸出二進位制 print len(a) #將得到的明文寫到文字 with open("d:/zip2.txt","w") as f: for i in range(0,len(a),8): str = toasc(a[i:i+8])#化成ASCII碼 print chr(str)#輸出明文 f.write(chr(str)) str ="" f.closed