用python试着制作了音频的LSB隐藏算法,但过程是曲折的。 虽然结果还存在一些瑕疵,但毕竟还不太习惯音频信号处理,但结果总算成功了。
1 .环境
windows10操作系统、pycharm编辑器、python3.9、第三方库: librosa、bitarray
1.1bitarray的安装
选择安装bitarray是为了解决英语字符串和二进制字符串的转换问题
pip安装二进制
1.2安装librosa
这是一个Python模块,通常用于分析音频信号,但倾向于音乐。 这包括用于构建音乐信息搜索(MIR )系统的nuts和bolts。
pip安装库
2 .转码函数defstr2bitarray(s ) :s.replace(r'n ',' ) ret=bitarray('.join ) [蓝色兔子] int ('1' hard )
bitarray2str ) )函数:起到将解密后的二进制字符串转码成明文的作用
3 .原理
以上是图像的lsb隐藏算法,音频也很相似
一句话,如果音频采样点是32位浮点类型,则替换其中不太重要的位置对音频影响很小,并且极难发现。 例如,从0.005689变更为0.005680。
4 .算法是importlibrosafrombitarrayimportbitarrayimportsoundfileassfimportnumpyasnpbit _ float={ ' 00 ' 3360.00001,' 01 ' 11 ' :000004 } float _ bit={ 8: ' 00 ',9:'00 ',10:'00 ', 11:'00' 83:'10 '、29:'10 '、30:'10 '、31:'10 '、383360'11 '、393360'11 '、403: ' 10 ' 40:'413360 ' ' ) ret=Bitarray(''.Join ) [蓝兔子(int ) (1'hex ) [2:] 16 ) [ 3: ] forc ins.encode () defbit2float(bit ) : if bit.to01 (in bit _ float.keys ) : return bit _ float [ bit.to01 ] (deffloat2bit ) ) )。 for key,valueinbit _ float.items (: iffloat==value : returnkeydeflsb (audio file,hidefile ) :数据, Sr=Librosa.load(audiofile ) #隐藏文本infor=''withopen ) hidefile, ' rb ' ) ASF : infor=str2bitarray (f.read ).decode (utf-8 ) ) start=0end=2foriinrange (len (infor ) ) ) )=bit2float(infor[start:end] ) start=2end=2# librosa.output.write _ example.wav ',data (SF.write ) samplerate=sr,sumplerate hidedfile(:data,Sr=Librosa.load ) Audiofile ) hidedata, Sr1=Librosa.load(hidedfile ) infor='forIinrange ) len ) data ) ) : item=int (hidedata ) (I ) ) ) if item 53360 breakin for=bitarray2str (infor ) withopen(r () (2.txt ),' w ' ) ASf:f.write(infor ) LSB (r ' c 3330 )
LSB )“音频载体_WAV格式”、“密文() :加密函数
UNLSB (“加密前音频”、“加密后的音频”) :解密函数
4.1由于缺陷python没有指针,没有对浮点型采样点进行某些位操作的好方法。 这里采用投机的方法,定义了词典bit_float={'00': 0.000001,' 01': 0.000002,' 10 '
将每两位二进制转换后的float型加到原采样点上,将原采样点与加密采样点的差值作为提取时的判断标准。 这样的缺点很明显,为了在第一解码时导出明文,需要与原始载波进行比较,第二,因为进行了float型加法,所以作为近似值得到,不稳定。 第三,如果不是对部分比特的操作,信息利用率不高,嵌入容量低。
为了解决float型加减时近似计算的弊端,从隐性信息采样点中减去原始采样点时*10000000
int () hidedata [ I ]-data [ I ] * 100000000 )转换为整数,取8、9、10、11约为10,取18、19、20、21为20、28、29、30、21 为转换编写词典
float _ bit={ 8:00、9:00、10:00、11336000、18336001、19336001、20336013:00。
4.2加密与加密前后的波形图无明显区别
测试中的英语都是可能的。
librosa_test.py-系统安全文档类资源-CSDN下载