LSB算法&code

LSB(Least Significant Bit) 最低有效位算法

        利用載體對象的最低一位或者幾位來進行祕密信息的隱藏。LSB算法是隱寫術中最常見的算法,多用於圖像和聲音

 

解釋:

假如一個數,轉換爲二進制,10101010,最左邊是高位,最右邊是低位

高位的權重大,低位的權重小,自然改變低位對圖像的影響小

 

注意:應用LSB算法的圖像格式需爲位圖形式,即圖像不能經過壓縮,如LSB算法多應用於png、bmp等格式,而jpg格式較少

 

Lena圖的比較

 

可以看出:

    ①Lena圖去掉最低1位甚至最低1-4位對圖像的整體視覺效果沒有太大影響

    ②Lena圖去掉最低1位對圖像的統計特性影響不明顯。

對於幾乎所有的灰度圖,以上兩個結論均成立

 

matlab代碼

 

LSB隱寫

只將最低1位用來隱藏信息

cover = imread('lena600.bmp');     % 讀取載體圖像
ste_cover = cover;
ste_cover = double( ste_cover ) ;

f_id = fopen('msg-hlm.txt', 'r') ;    % 讀取待隱藏的文本文件,並將轉換爲二進制序列
[ msg, len_total] = fread( f_id, 'ubit1') ;

[m,n] = size( ste_cover ) ;
if len_total > m* n       % 判斷嵌入消息量是否過大
    error( '嵌入消息量過大, 請更換圖像') ;
end

p = 1;           % p 作爲消息嵌入位數計數器
for f2 =1:n
  for f1 =1:m
    ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ;
    %mod 2 就去掉了最低一位,再加上需要隱藏的信息,就把最後一位變爲需要隱藏的信息了
    if p == len_total
       break;
    end
    p = p + 1;
end
    if p == len_total
        break;
    end
end

ste_cover = uint8( ste_cover ) ;
imwrite( ste_cover,'lena_lsb.bmp') ;             % 生成隱藏信息的圖像,並進行存儲
subplot(2,2,1); imshow( cover); title('原始圖像') ;     % 顯示實驗結果
subplot(2,2,2); imhist( cover); title('原始圖像直方圖') ;
subplot(2,2,3);imshow( ste_cover); title('隱藏信息的圖像') ;
subplot(2,2,4);imhist( ste_cover); title('隱藏信息圖像直方圖') ;

 

LSB提取

也是1位

ste_cover = imread('lena_lsb.bmp') ;
ste_cover = double( ste_cover ) ;
[m,n] = size(ste_cover) ;
len_total=m*n;         % 若知道隱藏信息的長度,可在此處直接將其賦給len_total
frr = fopen('recover.txt', 'w+') ;
p = 1;                % p 作爲消息嵌入位數計數器, 將消息序列寫回文本文件

for f2 = 1:n
  for f1 = 1:m
    if bitand( ste_cover( f1, f2) , 1) == 1     %判斷奇偶,奇的說明最後一位是1,說明這位嵌入了信息
      fwrite( frr, 1, 'ubit1') ;
    else
      fwrite( frr, 0, 'ubit1') ;
    end
    if p==len_total
      break;
    end
  p = p + 1;
  end
  if p==len_total
    break;
  end
end
fclose( frr) ;

 

我輸入的文本是 “I’m hxx”

提取出來的也是

現在查看一下“I'm hxx”的二進制表示

這是16進制顯示的

而在代碼中,matlab中的msg

是56位bit的二進制,而“I'm hxx”是12位,56/4正好等於12

再看16進製表示的4927,4的二進制是100,9是1001,和msg的開頭幾位也對應起來了

 

剛纔的結果是len_total直接賦值成56了

如果不知道的話應該是

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章