0. 背景
音頻資訊隱藏技術就是將秘密資料直接嵌入音頻載體中,但不影響原載體的使用價值,也不容易被人的知覺系統覺察或注意到,
音頻資訊隱藏技術作為資訊隱藏技術的一個重要分支,受到越來越多的關注,
近年來,雖然數字音頻資訊隱藏技術的研究作業發展很快,出現了一些代表演算法,但是與影像資訊隱藏演算法相比,數字音頻資訊隱藏技術面臨著更大的挑戰,因為人類聽覺系統對隨機噪聲十分敏感,使得可以嵌入的資料量非常有限,
為了能夠簡明扼要地對音頻資訊隱藏技術進行說明,本文對WAV音頻的LSB這種時域資訊隱藏演算法進行了研究,
1. LSB演算法原理簡介
LSB全稱為:Least Significant Bit,即最不重要位,LSB方法是一種最簡單的資料嵌入方法,任何秘密資料都可以看做是一串二進制位流,而音頻檔案的每一個采樣資料也是用二進制數來表示的,這樣,可以將每一個采樣值的最不重要位(大多數情況下為最低位),用代表秘密資料的二進制位替換,以達到在音頻信號中編碼進秘密資料的目的,
下圖即為利用LSB演算法進行資訊隱藏的程序,

提取隱藏的資訊時的程序圖如下圖所示,

由圖可知,如果有人截獲了含有隱藏資訊的音頻采樣資料,并且此人知道這段音頻里藏有資訊,且他知道被替換位為最低位,那么這個人就破解了這個秘密資料了,
因此對于LSB演算法來說,密鑰就是秘密資料的替換位的位置資訊,如果想加大對秘密資料攻擊的難度,可以用一段偽隨機序列來控制嵌入秘密二進制位的位置,那么這段偽隨機序列就可以作為密鑰了,
2. 資訊隱藏代碼實作(隨機序列)
下面,為了簡化代碼,易于讀者理解,秘密資料采取的是一串隨機生成的序列,并且采用的是二進制的最低位替換方法,
clc;
clear;
fid = fopen('music_new.wav', 'r');
oa = fread(fid, inf, 'uint8');
fclose(fid);
n = length(oa) - 44;
d = randsrc(1, n, [1 0]);
M = oa;
for i = 45 : 45 + n - 1
M(i) = bitset(M(i), 1, d(i - 44));
end
fid = fopen('music_new_secret.wav', 'wb');
fwrite(fid, M, 'uint8');
fclose(fid);
figure;
[y1,Fs] = audioread('music_new.wav');
x1 = (0:length(y1) - 1)/Fs;
subplot(2, 1, 1);
plot(x1, y1);
axis([0 max(x1) -1 1]);
xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
[y2,Fs] = audioread('music_new_secret.wav');
x2 = (0:length(y2)-1)/Fs;
subplot(2, 1, 2);
plot(x2, y2);
axis([0 max(x2) -1 1]);
xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
figure;
subplot(2, 1, 1); plot(x1, y1); axis([0 0.6 -0.05 0.05]);
xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
subplot(2, 1, 2); plot(x2, y2); axis([0 0.6 -0.05 0.05]);
xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
-
這里解釋一下第7行代碼,為什么要減去44,同時也是解釋了第10行代碼,為什么要從45開始,
因為我們是在wav格式的音頻檔案中進行資訊隱藏,而wav格式的音頻檔案中,從檔案頭到資料前面一共有44位元組的檔案格式說明,因此在進行資訊隱藏時,要跳過這44位, -
再解釋一下第8行代碼,第8行代碼采用了MATLAB的生成指定范圍的亂數函式,生成的亂數是1行n列的行向量,這個行向量的內容只有0和1,即,隨機生成的這個向量d就是用來模擬一段秘密資料,
-
第7行到第12行代碼就是LSB演算法的實作,首先第7行定義秘密資料的長度(這里取了能加密的最長的長度),第8行生成了秘密資料d,第9行將原始音頻的采樣資料oa賦值給M,利用M存盤含有隱藏資訊的音頻采樣資料,第10行到第12行的代碼,利用bitset函式,將M從第45個元素開始的每一位的最低位用秘密資料d的對應位替換掉,完成秘密資料的隱藏,
在給出程式運行圖之前,需要說明的是,這個音頻是一首歌曲的前奏,并且,我們給的秘密資訊的長度遍布了整個時域,對于這個時長為29秒的音頻,它最多能夠存盤的秘密資訊長度是2557800bit,換算后為319725Byte,約等于312KB,

下圖是程式運行后輸出的圖片,第一張圖是原始音頻時域波形圖,第二張圖是含有隱藏資訊的音頻時域波形圖,

從上面的對比圖中難以看出差異,我們將其放大,將橫軸的顯示范圍更改為0-0.6秒,這樣便能夠明顯地看出差異,

3. 提取隱藏資訊代碼實作(隨機序列)
fid = fopen('music_new_secret.wav', 'r');
oa = fread(fid, inf, 'uint8');
m = oa;
n = length(oa) - 44;
for i = 1 : n
w(i) = bitget(m(44 + i), 1);
end
fclose(fid);
rate = length(find(w ~= d)) / length(d);
- 提取隱藏資訊的實作部分是在程式的第4至第8行,第4行代碼將含有隱藏資訊的音頻采樣資料賦值給m,第5行代碼定義了待提取的秘密資料的長度(這個長度要和秘密資料d的長度保持一致,如果不一致,最終將會得到有缺失的秘密資料或者是多余的亂碼,至少這個長度不能大于音頻采樣資料的長度-44),第6行至第8行利用bitget函式,將m從第45個元素開始的每一位的最低位提取出來,存盤到w中,最終,w就是秘密資料,
- 第11行代碼計算了一下誤碼率,因為本程式在提取秘密資料前沒有對含有隱藏資訊的音頻做任何處理,因此這里得到的誤碼率rate為0,
4. 二值影像作為秘密資料
從第2節和第3節中,應該已經知道了資訊隱藏以及資訊提取的原理了,
接下來,我們把一副二值影像當做秘密資料來進行隱藏,
4.1 影像資訊隱藏的代碼實作
首先給出待隱藏的圖片,如下圖所示,

下面為影像資訊隱藏的代碼,
clc;
clear;
fid = fopen('music_new.wav', 'rb');
oa = fread(fid, inf, 'uint8');
fclose(fid);
n = length(oa) - 44;
io = imread('school.bmp');
[row col] = size(io);
wi = io(:);
if row * col > n
error('音頻載體太小,請更換載體');
end
info_hd_audio = oa;
for k = 1 : row * col
info_hd_audio(44 + k) = bitset(info_hd_audio(44 + k), 1, wi(k));
end
fid = fopen('music_new_secret.wav', 'wb');
fwrite(fid, info_hd_audio, 'uint8');
fclose(fid);
figure;
[y1, Fs] = audioread('music_new.wav');
x1 = (0:length(y1) - 1) / Fs;
subplot(2, 1, 1);
plot(x1, y1);
axis([0 max(x1) -1 1]);
xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
[y2, Fs] = audioread('music_new_secret.wav');
x2 = (0:length(y2) - 1) / Fs;
subplot(2, 1, 2);
plot(x2, y2);
axis([0 max(x2) -1 1]);
xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
figure;
subplot(2, 1, 1); plot(x1, y1); axis([0 0.6 -0.05 0.05]);
xlabel('Time / (s)');ylabel('Amplitude');title('original audio');
subplot(2, 1, 2); plot(x2, y2); axis([0 0.6 -0.05 0.05]);
xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
代碼的第11行到第13行是用來判斷音頻載體的大小是否足夠用來隱藏待隱藏的圖片,原理是:將原始音頻采樣資料oa減去44(wav檔案的格式說明)后賦值給n,n即為這個音頻最多能隱藏的資訊的大小(單位為bit),再將二值影像的總的像素個數(row * col)與n作比較,如果像素個數小于等于n,那么程式繼續執行,否則,載體不足以隱藏這個二值影像,
除此之外,此代碼的核心原理與隱藏資訊為隨機序列的代碼(第2節)一致,因此不做過多介紹,
下圖是程式運行后輸出的圖片,第一張圖是原始音頻時域波形圖,第二張圖是含有隱藏資訊的音頻時域波形圖,

從上面的對比圖中難以看出差異,我們將其放大,將橫軸的顯示范圍更改為0-0.6秒,這樣便能夠明顯地看出差異,

4.2 對含有影像的音頻進行攻擊(壓縮)的代碼實作
clc;
clear;
[y,Fs] = audioread('music_new_secret.wav');
x = (0:length(y) - 1) / Fs;
y1 = y * 0.8;
subplot(2, 1, 1);
plot(x, y);
axis([0 max(x) -1 1]);
xlabel('Time / (s)');ylabel('Amplitude');title('information hiding audio');
subplot(2, 1, 2);
plot(x, y1);
axis([0 max(x) -1 1]);
xlabel('Time / (s)');ylabel('Amplitude');title('attacked audio');
audiowrite('music_new_secret_attacked.wav', y1, Fs);
對嵌入影像的音頻進行壓縮攻擊測驗,代碼的第5行即是對音頻的幅值進行壓縮,壓縮的倍數為0.8,
下圖是程式運行后輸出的圖片,第一張圖是含有影像的音頻時域波形圖,第二張圖是幅值壓縮0.8倍后的含有影像的音頻時域波形圖,

4.3 提取隱藏影像的代碼實作
clc;
clear;
fid = fopen('music_new_secret.wav', 'r');
oa = fread(fid, inf, 'uint8');
fclose(fid);
n = 40000;
for i = 1 : n
w(i) = bitget(oa(44 + i), 1);
end
w = w';
m1 = reshape(w, 200, 200);
figure;
imshow(m1);
imwrite(m1, 'school_extract.bmp', 'bmp');
fid = fopen('music_new_secret_attacked.wav', 'r');
oa = fread(fid, inf, 'uint8');
fclose(fid);
n = 40000;
for i = 1 : n
w(i) = bitget(oa(44 + i), 1);
end
w = w';
m1 = reshape(w, 200, 200);
figure;
imshow(m1);
imwrite(m1, 'school_extract_attacked.bmp', 'bmp');
代碼運行后輸出兩張圖片,第一張圖片是原圖片與由未被攻擊的含有影像的音頻中提取到的圖片的對比圖,如下圖所示,

第二張圖片是原圖片與由被攻擊的含有影像的音頻中提取到的圖片的對比圖,如下圖所示,

由此可見,LSB演算法的魯棒性很差,
4.4 更改載體音頻重做一次實驗
上面做過的所有實驗,采用的載體音頻都是同一段音頻,即一段長達29秒的歌曲前奏,
接下來,我將載體音頻改為本人錄制的一段錄音,錄音的環境為空慷訓境,內容為口播“一、二、三”,
用到的所有代碼與上面的代碼都是一樣的,僅僅是讀取的音頻檔案不同,因此直接給出結果圖,
下圖是影像資訊隱藏的代碼運行后輸出的圖片,第一張圖是原始音頻時域波形圖,第二張圖是含有隱藏資訊的音頻時域波形圖,

從上面的對比圖中難以看出差異,我們將其放大,將橫軸的顯示范圍更改為0-0.6秒,這樣便能夠明顯地看出差異,

下圖是對含有影像的音頻進行攻擊(壓縮)的代碼運行后輸出的圖片,第一張圖是含有影像的音頻時域波形圖,第二張圖是幅值壓縮0.8倍后的含有影像的音頻時域波形圖,

最后,提取隱藏影像的代碼運行后輸出兩張圖片,第一張圖片是原圖片與由未被攻擊的含有影像的音頻中提取到的圖片的對比圖,如下圖所示,

第二張圖片是原圖片與由被攻擊的含有影像的音頻中提取到的圖片的對比圖,如下圖所示,

由此可見,LSB演算法的魯棒性很差,
5. LSB演算法的特點
LSB演算法的特點是:
- 本身簡單易實作,音頻信號里可編碼的資料量大 ,
- 采用流加密方式分別對資料本身和嵌入程序進行加密,其安全性完全依賴于密鑰,如果選擇偽隨機性能好的密鑰產生機制,則可以做到“一次一密”,
- 資訊嵌入和提取演算法簡單,速度快,
- 對信道干擾及資料操作的抵抗力很差,事實上,信道干擾、資料壓縮、濾波、重采樣、時域縮放等都會破壞編碼資訊,
6. 其他音頻資訊隱藏演算法
- 回聲隱藏演算法
- 相位隱藏演算法
- 傅氏變換域演算法
- 離散余弦變換域演算法
- 小波變換域演算法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233578.html
標籤:其他
