BMP 圖像信息隱藏及檢測

原理簡介

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

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

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

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

操做環境

Windows 10 操做系統spa

MATLAB 2019a 版本軟件操作系統

BMP 格式圖片文件code

010 編輯工具blog

技術過程

1、在實際的圖像數據後隱藏信息

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

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

(1)製做隱藏信息的圖片QftmModify1.bmpclass

建立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,獲得圖片存在信息隱藏。

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

在數據區開始以前隱藏信息,隱藏的祕密信息從 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進制清晰查看隱藏效果

3、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能夠看出來該圖片存在信息隱藏。

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

BMP 圖像文件中有不少從不使用的保留字節,如 七、八、九、10 字節是保留的,必須爲 0,可在第 七、八、九、10 字節隱藏祕密信息。

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

clc;
clear;
fid=fopen('Qftm.bmp','r'); %讀入載體圖像文件
[a,length]=fread(fid,inf,'uint8');
fclose(fid);
wa=a;
% 在BMP的七、八、九、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進制清晰查看隱藏效果

相關文章
相關標籤/搜索