1. 程式人生 > >資訊隱藏課程之簡單的LSB最低位隱寫

資訊隱藏課程之簡單的LSB最低位隱寫

# -*- 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