WAV音频lsb隐写 lsb原理 LSB全称为:Least Significant Bit,即最不重要位。LSB方法是一种最简单的数据嵌入方法。任何秘密数据都可以看做是一串二进制位流,而音频文件的每一个采样数据也是用二进制数来表示的。这样,可以将每一个采样值的最不重要位(大多数情况下为最低位),用代表秘密数据的二进制位替换,以达到在音频信号中编码进秘密数据的目的。 下图即为利用LSB算法进行信息隐藏的过程。
时域低比特位隐写 主要从LSB(Least Significant Bit)最低有效位隐写开始,其中包含LSB替换和LSB匹配。根据音频 时域波形的16比特样点值进行隐写
wav格式
代码思路如下
1 2 3 将输入内容转化为二进制数组 从data数据块(44字节)开始,逐字节读数据然后模2.与二进制数组对照,一样不变,不一样最低位进行替换. 数组内容隐写完毕后将后面八字节最低位替换为0,作为结束标志位
encode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 def encode_wav_lsb (filename, message, seek ): message_bit = '' .join('{:08b}' .format (ord (c)) for c in message) message_bit += '00000000' with open (filename, "rb+" ) as file: temp=file.read()[seek:seek+len (message)*8 +8 ] file.seek(seek) for i in range (0 ,len (message)*8 +8 ): if temp[i]<=15 : if temp[i]==15 : file.write(bytes .fromhex('0' +str (hex (temp[i])[2 :])) if str (temp[i] % 2 ) == message_bit[i] else bytes .fromhex(hex (temp[i]+1 )[2 :])) else : file.write(bytes .fromhex('0' +str (hex (temp[i])[2 :])) if str (temp[i] % 2 ) == message_bit[i] else bytes .fromhex('0' +str (hex (temp[i]+1 )[2 :]))) else : if temp[i]==16 : file.write(bytes .fromhex(hex (temp[i])[2 :]) if str (temp[i] % 2 ) == message_bit[i] else bytes .fromhex('0' +str (hex (temp[i]-1 )[2 :]))) else : file.write(bytes .fromhex(hex (temp[i])[2 :]) if str (temp[i] % 2 ) == message_bit[i] else bytes .fromhex(hex (temp[i]-1 )[2 :])) file.close()
1 encode_wav_lsb('./wav_lsb/stego100.wav' , 'message' ,44 )
隐写前
隐写后
decode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def decode_wav_lsb (filename, seek ): message_end = '00000000' message = '' with open (filename, "rb" ) as file: message_bit = '' temp=file.read()[seek:] for c in temp: message_bit += str (c % 2 ) if message_end in message_bit: break message = '' for i in range (0 , int (len (message_bit)/8 )-1 ): message += chr (int ('0b' + message_bit[8 * i:8 * (i + 1 )], 2 )) print (message)
波形
通过wav库获得.wav的头文件中的信息,如采样率/声道数等等.
提取出DATA区域的信息,用numpy将string格式数据转化为数组
通过判定声道数将DATA区域数据进行处理(对数组矩阵进行转换)
得到每个绘制点的时间(x坐标)
用matplotlib库提供的方法绘制出波形图
Python 读取WAV文件并绘制波形图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import waveimport pylab as pl import numpy as np f = wave.open (r"./wav_lsb/白金迪斯科.wav" , "rb" ) params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4 ] str_data = f.readframes(nframes) f.close() wave_data = np.fromstring(str_data, dtype=np.short) if nchannels == 2 : wave_data.shape = -1 , 2 wave_data = wave_data.T time = np.arange(0 , nframes) * (1.0 / framerate) pl.subplot(211 ) pl.plot(time, wave_data[0 ]) pl.subplot(212 ) pl.plot(time, wave_data[1 ], c="g" ) pl.xlabel("time (seconds)" ) pl.show() elif nchannels == 1 : wave_data.shape = -1 , 1 wave_data = wave_data.T time = np.arange(0 , nframes) * (1.0 / framerate) pl.subplot(211 ) pl.plot(time, wave_data[0 ]) pl.xlabel("time (seconds)" ) pl.show()
隐写前
隐写后
隐写位置比较集中且在最开头,可以根据波形图直观识别。
为隐藏信息可以隐写在分散且有声音的位置