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了
如果不知道的話應該是