概念 #
关于音频中的采样率
/比特率
等概念,可以参看:
双音多频信号DTMF(Dual Tone Multi Frequency),电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码,对应着我们小时候打电话按下不同按键的声音
DTMF由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信号有如下16个编码
在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续(早期方法,很老很古董)
http://dialabc.com/
https://baike.baidu.com/item/DTMF/3106215
隐写 #
反向 #
音频可能被反向了,在Audacity中,选择"特效"、“反向"菜单项
频谱/波形隐写 #
使用Audacity软件打开,左上角切换显示,切换到频谱图
类似,左上角切换显示,也可以切换到波形图
频谱/波形可能结合摩尔斯电码或二进制表示出题
如下,频谱结合摩尔斯电码,.-.. .- --.
如下,波形二进制表示,以高为 1 低为 0,1100110110
MP3Stego隐写 #
MP3Stego hides information in MP3 files during the compression process. The data is first compressed, encrypted and then hidden in the MP3 bit stream. 具体细节未研究
官网地址:https://www.petitcolas.net/steganography/mp3stego/
Github地址:https://github.com/fabienpe/MP3Stego
各版本下载地址:https://www.petitcolas.net/fabien/software/
如使用GUI版本,需要把mp3文件放入工具目录下,输入密码(可以为空)即可提取隐藏的txt文件
MP3 private bit隐写 #
MP3格式的帧数据中,有一个uint32 private_bit,可以作为私有数据的标记位,可以使用该标记为隐藏数据
可以先判断前8个mf的private_bit
是否为01100110
以下为提取mp3中每帧的private_bit
代码,由于mp3每个帧长度可能不同,会有会变化,需结合题目实际进行修改
import re
# 起始位置(是padding的起始位置)
n = 235986
result = ''
files = open('1666e57f47234c5b84bf0a21a23d8227.mp3', 'rb')
# 提取
while n < 2706539: # 结束位置
files.seek(n, 0)
head = files.read(1) #读取一个字节(8位)
# padding_bit位于第三个字符的倒数第二位, private_bit位于第三个字符的倒数第一位
padding = '{:08b}'.format(ord(head))[-2]
result += '{:08b}'.format(ord(head))[-1]
# files.seek(n + 1, 0)
# file_read_result = files.read(1)
# copyright位于第四个字符的倒数第四位
# result += '{:08b}'.format(ord(file_read_result))[-4]
# 观察本文件得知如果padding位为1,帧长度就是418,padding位为0,帧长度就是417
n += 418 if padding == "1" else 417
# 拼接
flag = ''
textArr = re.findall('.{' + str(8) + '}', result)
for i in textArr:
flag = flag + chr(int(i, 2)).strip('\n')
print(flag)
同时也可能存在使用copyright
位进行隐写,需观察是否相邻几帧的数据有0有1,并进行调整
LSB隐写 #
silenteye 软件的作用可以将信息(原始或压缩或加密的文本、文件)通过LSB的方式隐藏于图像和音频中
导入音频文件,点击Decode
即可还原出被隐藏的文本或文件