BMP 圖像信息隱藏及檢測


原理簡介

針對文件結構的信息隱藏方法需詳細掌握文件的格式,利用文件結構塊之間的關系或根據塊數據和塊大小之間的關系來隱藏信息。

BMP(Bitmap-File)圖形文件是 Windows 采用的常見圖形文件格式,要利用 BMP 位圖進行信息隱藏首先需要詳細了解 BMP 文件的格式,BMP 圖像文件結構比較單一而且固定,BMP  圖像由文件頭、信息頭、調色板區和數據區四個部分組成,而 24 位真彩色圖像中沒有調色板信息。24 位真彩色 BMP 位圖文件包括 3 部分。 第一部分是 BMP 文件頭(14個字節)。前 2 個字節是“BM”,是用於識別 BMP文件的標志;第 3、4、5、6 字節存放的是位圖文件的大小,以字節為單位;第7、8、9、10 字節是保留的,必須為 0;第 11、12、13、14 字節給出位圖陣列相對於文件頭的偏移,在 24 位真彩色圖像中,這個值固定為 54;第二部分是位圖信息頭(40個字節)。第19,20,21,22字節表示的是圖像文件的寬度,以像素為單位;第23,24,25,26 字節表示的是圖像文件的高度,以像素為單位。從第 29個字節開始,第 29、30 字節描述的是像素的位數, 24 位真彩色位圖。該位的值為 0x18; 第三部分是數據區。從第 55 個字節開始,每 3 個字節表示一個像素,這 3 個字節依次表示該像素的紅、綠、藍亮度分量值。

在不影響圖像正常顯示情況下,可使用以下四種方法在 24 位真彩色 BMP 圖像中隱藏信息。

  • 在圖像文件尾部添加任意長度的數據,秘密信息存放在文件尾部可以減少修改文件頭的數據量,僅需修改文件頭中文件長度的值即可。
  • 在調色板或者位圖信息頭和實際的圖像數據之間隱藏數據,如果將秘密數據放在文件頭與圖像數據之間,則至少需要修改文件頭中文件長度、數據起始偏移地址這兩個域的值。
  • 修改文件頭和信息頭中的保留字段隱藏信息。
  • 在圖像像素區利用圖像寬度字節必須是 4 的倍數的特點,在補足位處隱藏數據。

操作環境

Windows 10 操作系統

MATLAB 2019a 版本軟件

BMP 格式圖片文件

010 編輯工具

技術過程

一、在實際的圖像數據后隱藏信息

待隱藏的秘密信息文件名稱為  hidden.txt,  Baboon.bmp  為載體圖像,將載體和秘密信息放置在同一個目錄下,在 Windows 的 MS-DOS 方式下執行命令 Copy baboon.bmp /b + hidden.txt /a baboon1.bmp  ,其中參數/b 指定以二進制格式復制、合並文件,參數/a 以 ASCII 格式復制、合並文件。執行該命令后,生成一個新的 baboon1.bmp 文件,使用圖像瀏覽工具瀏覽該文件發現與原始載體圖像幾乎完全相同,信息隱藏在 baboon.bmp 文件的尾部。從 BMP 圖像的結構中可知,圖像的 3、4、5、6 四個字節存放整個 BMP 圖像的長度。使用該方法隱藏信息時,未修改圖像文件的文件長度字節,通過比較文件的實際長度和

文件中保存的文件長度,就可發現該圖像是否隱藏秘密信息。

(1)制作隱藏信息的圖片QftmModify1.bmp

創建Hidden.txt文件

制作QftmModify1.bmp

copy  Qftm.bmp/b + hidden.txt/a QftmModify1.bmp

(2)Matlab腳本檢測文件是否存在隱藏信息

檢測圖片QftmModify1.bmp文件長度

clc;
clear;
fid=fopen('QftmModify1.bmp','r'); %讀入載體圖像文件
[a,length]=fread(fid,inf,'uint8');%length 是文件的實際長度
fclose(fid);
fid=fopen('QftmModify1.bmp','r');
status=fseek(fid,2,'bof');
fileb=fread(fid,4,'uint8');
filelength=fileb(1)*1+fileb(2)*256+fileb(3)*256^2+fileb(4)*256^3 %文件圖像中保存的文件長度
diff=length-filelength;
%diff 表示隱藏的信息長度如果相同,表示圖像沒有隱藏任何信息。
fclose(fid);

運行腳本查看diff結果

 

 從結果可以看出來當沒有對bmp的文件頭文件長度進行修改時,隱藏的圖片diff差值不等於0,得到圖片存在信息隱藏。

二、文件頭與圖像數據之間隱藏信息

在數據區開始之前隱藏信息,隱藏的秘密信息從 hidden.txt 文件中讀取(隱藏整個文件),此種方法修改圖像數據的偏移量和圖像數據的文件長度。

(1)Matlab腳本進行隱藏信息

clc;
clear;
wm=randsrc(1,300, [0 1]); %  產生隨機水印
fid=fopen('Qftm.bmp','r'); %讀入載體圖像文件
[a,length]=fread(fid,inf,'uint8');
fclose(fid);
msgfid=fopen('hidden.txt','r');%打開秘密文件
[msg,count]=fread(msgfid);
fclose(msgfid);
wa=a;
j=1;
wa(11)=54+count;
wa(3)=wa(3)+count;
for i=55:54+count
    wa(i)=uint8(msg(j,1));%隱藏密碼信息
    j=j+1;
end
for i=55:length
    wa(i+count)=a(i);
end
figure;
wa=uint8(wa);
fid=fopen('watermarked.bmp', 'wb');
fwrite(fid,wa);
fclose(fid);
I=imread('Qftm.bmp');
J=imread('watermarked.bmp');
subplot(1,2,1)
imshow(I)
title('未修改圖像');
subplot(1,2,2)
imshow(J)
title('修改后圖像')

運行結果查看

  分析《watermarked.bmp》16進制清晰查看隱藏效果

三、BMP 圖像文件隱藏信息的檢測

在BMP圖像中隱藏信息的時候一般都是通過修改文件的偏移量和圖像文件中圖像的長度來隱藏信息,但在BMP圖像文件中,file_length=biwidth*biBytecount*biHeight+bfoffBits,其中  biwidth,biheight表示

圖像文件的寬度和高度,bfoffBits表示文件頭到實際位圖圖像數據之間的偏移量。

(1)Matlab腳本對Bmp進行信息隱藏多層Check

clc;
clear;
wm=randsrc(1,300, [0 1]); %  產生隨機水印信息
fid=fopen('watermarked.bmp','r'); %讀入載體圖像文件
[a,length]=fread(fid,inf,'uint8');
status=fseek(fid,2,'bof');
fileb=fread(fid,4,'uint8');
filelength=fileb(1)*1+fileb(2)*256+fileb(3)*256^2+fileb(4)*256^3 %文件圖像的理論長度
status=fseek(fid,10,'bof');
b=fread(fid,4,'uint8');
bfoffbitsmodify=b(1)*1+b(2)*256+b(3)*256^2+b(4)*256^3 %讀取偏移量
status=fseek(fid,18,'bof');
b=fread(fid,4,'uint8');
biwidth=b(1)*1+b(2)*256+b(3)*256^2+b(4)*256^3
status=fseek(fid,22,'bof');
b=fread(fid,4,'uint8');
biHeight=b(1)*1+b(2)*256+b(3)*256^2+b(4)*256^3;
bfoffbits=54;%偏移量
biBytecount=3;%24 位真彩色圖像為 3
filetruelength=biwidth*biBytecount*biHeight+bfoffbits %圖片實際真實長度(固定偏移54)
filelengthbfoffbits=biwidth*biBytecount*biHeight+bfoffbitsmodify %讀取偏移計算文件長度
fclose(fid);
diff1=length-filelength;        %未修改圖片長度時Check1
diff2=filelength-filetruelength %修改了圖片長度時Check2
diff3=filelengthbfoffbits-filetruelength %修改了圖片偏移時Check3
diff=diff1+diff2+diff3

對watermarked.bmp(文件長度和文件偏移都被修改了)進行測試,根據diff的值進行判定該圖片是否存在信息隱藏,運行結果查看:

從結果diff != 0可以看出來該圖片存在信息隱藏。

四、在圖像文件頭和信息頭的保留字段中隱藏信息

BMP 圖像文件中有很多從不使用的保留字節,如 7、8、9、10 字節是保留的,必須為 0,可在第 7、8、9、10 字節隱藏秘密信息。

(1)Matlab腳本對Bmp的保留字段隱藏信息

clc;
clear;
fid=fopen('Qftm.bmp','r'); %讀入載體圖像文件
[a,length]=fread(fid,inf,'uint8');
fclose(fid);
wa=a;
% 在BMP的7、8、9、10保留字中隱藏秘密信息Qftm,ASCII值為0x51 0x66 0x74 0x6d
wa(7)=81;
wa(8)=102;
wa(9)=116;
wa(10)=109;
figure;
wa=uint8(wa);
fid=fopen('watermarkedReserve.bmp', 'wb');
fwrite(fid,wa);
fclose(fid);
I=imread('Qftm.bmp');
J=imread('watermarkedReserve.bmp');
subplot(1,2,1)
imshow(I)
title('未修改圖像');
subplot(1,2,2)
imshow(J)
title('修改后圖像')

  分析《watermarkedReserve.bmp》16進制清晰查看隱藏效果

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM