一、实验目的
了解WAV文件格式,掌握利用WAV格式音频文件实现LSB信息隐藏原理,设计并实现一种基于WAV文件的LSB信息隐藏算法,同时自行练习设计实现一种次第有效位的音频隐写算法。
了解归一化相关系数NC的原理,利用NC对嵌入的水印图像和提取的图像水印进行比较。
二、实验环境
(1) Windows 11操作系统;
(2) Python3.7;
(3) Python的wave、numpy、matplotlib、opencv-python库;
(4) wave音频文件和二值水印图像文件。
三、实验步骤和结果
1. 将 carrier.wav 读入并转为直接数据,将灰度图读入转为一维数组并二值化,然后 采用次低有效位的方式将图像数据隐写到音频文件中。
信息隐藏的代码中,核心部分即采用次低有效位嵌入的代码如下所示:
运行代码,结果如下:
完成LSB嵌入之后,首先我对LSB嵌入前后的音频文件进行听觉上的区分,二者靠人耳听不出任何差别。从上图也可以看出,
LSB信息隐藏后,对原始音频的波形影响也非常小,几乎看不出任何差别,这说明LSB隐藏的音频透明性非常好。当然,和通过最低有效位进行隐写的方式相比,差距还是稍微大一些。
2. 将隐写后的音频文件读入并转为 numpy 数据,然后按照隐写时的方式提取水印,提取每一数据的次第有效位。
然后将提取后的数据转为二维矩阵并转为 8bit 的灰度图保存,最后计算 NC值。
信息提取的代码中,核心部分即提取次低有效位数据的代码如下所示:
运行代码,结果如下:
首先通过肉眼对比上图中原始水印图像和提取水印图像的差异,发现二者无法看出任何差异。
然后计算这两张图像的NC值,在本例中,携密音频未发生任何变化,也就是说未对携密音频进行任何形式的攻击。因此提取出来的水印信息和原始的水印信息完全相同,归一化函数的值为1。运行计算NC值的代码后的结果如下:
可以看到,NC值为100.0%,与预想结果一致。
四、实验遇到的问题及解决方法
(1)运行hide.py时,python环境没有cv2包,在pycharm的设置里面也无法顺利安装。
解决方法:
选择国内源的镜像下载并安装。我选择的是https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/,将对应版本的cv2包下载后,打开Anaconda Prompt,进入pytorch虚拟环境,并跳转至保存cv2包的本地地址,进行安装即可:
五、实验心得体会和思考
通过WAV音频的LSB信息隐藏实验,我更加深入地了解了信息隐藏和数字水印的基础技术、WAV文件格式和归一化相关系数NC的原理,较好地掌握了LSB针对WAV音频的隐写及提取的基本操作,在理论基础和动手实践方面都得到了很大的提升,这些都是仅在课堂学习中获取不到的宝贵经验,正所谓“实践方能出新知”。
同时,我对python这门语言以及相应的开发工具(pycharm)的使用有了更进一步的熟练掌握,也真真切切地感受到了编程语言应用于实际场景的快捷和便利。