65.9K
CodeProject 正在变化。 阅读更多。
Home

用于“充分隐藏”的音频隐写术 (AS4PGC)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2021 年 9 月 24 日

MIT

31分钟阅读

viewsIcon

17090

downloadIcon

325

压缩、加密并将秘密文件隐藏在音频文件中(MP3、WAV、OGG、FLAC 等)

向您的朋友和家人发送秘密消息,或将重要事物存储在没有人能找到的地方!

在本文中,您将了解如何保护您的数字隐私,通过结合 隐写术来增强加密提供的安全性。

引言

加密已不足以保护您的数据!

不仅存在“后门”和“弱密码”的风险,而且当前加密算法的密钥有时会被故意限制,以便“他们”能够访问您的数据。

除了这些危险之外,随着量子计算的到来,当前用于确保数据安全的加密系统可能很快就无法提供任何保护。

政府和公司存储您的数据是一个公开的秘密,即使它们已被加密且他们目前无法访问。

您现在发送或存储的、使用当前算法加密的所有信息,在不久的将来可能会被解密和泄露,从而暴露您的秘密。

幸运的是,有一种当前技术可以通过首先“隐藏”数据来“绕过”这个问题,使其对攻击者“不可见”。

这项技术就是“隐写术”。

本文介绍了一种新的隐写技术及其作为命令行界面 (CLI) 工具的实现,该工具除了加密外还使用“音频隐写术”。

目录

工具

在深入细节之前,您可能想先稍微玩一下这个工具,感受一下您能用它做什么。

该命令行工具只是您在终端或命令提示符中键入的一个命令。

使用默认设置时,该工具易于使用。无需特殊知识。

它还提供了高级功能,可以通过提供可选参数来使用。

安装

对于 Windows 和 Linux 上的 Python 包的安装和管理,pip 是首选选项。

这就是为什么我创建了一个 PyPi 项目,您可以在以下链接找到它

只需按照链接中的说明操作即可。

基本上,您需要在控制台输入此命令

pip install as4pgc

并且还需要安装 ffmpeg。在 Linux 中输入

sudo apt install ffmpeg

对于 Windows,请按照此链接中的说明操作

如果需要,您可以通过输入以下命令随时升级工具

pip install --upgrade as4pgc

要检查当前安装的版本,请键入

as4pgc -V

如何使用 / 建议

安装后,有关所有选项及其描述的完整列表,您可以键入

as4pgc -h

例如,将任何类型的文件隐藏在 .mp3 文件中

as4pgc -w secret.zip carrier.mp3

使用 -p 选项激活绘图并跟踪信号处理步骤。

使用 -v 选项输出详细信息。

然后,使用以下命令恢复隐藏文件

as4pgc -r stego.mp3

但是,在开始之前,请注意以下建议。

一项重要建议是避免使用任何公开可用的载体文件。

如果载体文件和隐写文件都落入攻击者手中,他可以通过比较两个文件轻松提取差异。

当然,即使在这种情况下,他仍然需要使用正确的嵌入设置来提取消息并解密它,可能需要进行暴力破解攻击。

所以,虽然使用公开可用的文件不是立即的问题,但如果可能,请不要让攻击者走到那一步。

在某些情况下,仅仅知道文件中隐藏了一条消息本身可能就是一个问题。因此,请尝试

  • 录制您自己的音频文件,如果可能,销毁原始载体文件。
  • 避免过多的静默或低音频电平。
  • 不要在载体中给秘密消息任何提示,例如,将隐写文件作为“语音留言”发送给朋友,告诉他关于您虚构的或真实的假期。

在文件中,您可以隐藏例如访问 Google Drive 共享文件夹的用户密码。有关更多想法,请查看 应用

下图说明了其原理

图 1:隐藏和恢复秘密消息的步骤(示例)

方法概述

此隐写技术的目标是将信息隐藏在压缩音频文件中,而不是使用经典的最不显著位 (LSB) 隐写术,该技术通常应用于 .WAV 文件。

LSB 代表最不显著位,因此 LSB-隐写术是指用我们想要隐藏的数据位替换容器/载体文件字节的最不显著位,结果是一个隐写文件。

一些压缩音频格式的例子包括 MP3、FLAC 和 OGG。

但使用当前方法,也可以使用未压缩的 .WAV 文件作为载体介质,有时会替换超过 LSB 的位数。

这会降低嵌入容量,但使用的是一种更普及、因此更不引人注目的音频格式。

但是,为什么我们不直接在压缩音频文件中使用 LSB-隐写术呢?

主要原因是在 .MP3 格式中,无法像在 .WAV 格式中那样直接操作单个样本的单个比特,因为转换会导致变化,例如 .MP3 格式会扭曲信号操作。

对样本单个比特的修改太小,无法可靠地在音频压缩中保留下来。相反,在本技术中,音频信号被划分为小块,然后计算每个块的 FFT(快速傅里叶变换)。

通过在交替块中增加或减小 FFT 的幅度来操纵特定频率获得的 FFT 序列。

要将编码后的音频信号恢复回“时域”,我们只需对 FFT 序列中的每个编码块执行逆 FFT。

编码是在交替块中完成的,使用未修改的块作为参考点。这些参考点之间的线性插值决定了我们需要恢复一和零之间的阈值。

重要的是 FFT 序列具有高度相关的连续样本。这就是为什么,例如,如果我们以白噪声作为输入,隐藏秘密消息会更加困难。

下图说明了其原理

图 2:FFT 序列的编码(示例)

上面的 3D 图具有轴块、FFT 和频率 (f)。虚线显示了每个块的 FFT,即块 0、1 等的 FFT(f)。

在这些 FFT 中,我们只编码某些频率,表示为 fcN。

例如,三个序列分别用红色、绿色和蓝色着色,对应于编码频率 fc0fc1fc2

偶数块用作参考点,而奇数块则以二进制编码,包含 1 和 0。

以块 3 中的序列 S0 为例,我们在此找到一个 1,因为如果我们设置 S0(2) 和 S0(4) 之间的线,插值将在此点之上。

一个 0,如 S1(3),将高于 S1(2) 和 S1(4) 之间的线性插值确定的点。

最后,在特定频率上未编码的块将接近插值的值,该值将被跳过(丢弃)。S0(1) 是一个例子。

下图显示了另一个示例

图 3:FFT 序列内的线性插值(示例)

但是,这究竟是如何发生的?

最重要的一点是,当追求相当高的容量同时保持失真在非常低的水平(听不见)时,并非所有信号修改都能在音频压缩中“幸存”。

也就是说,在将消息嵌入到以 PCM 格式处理然后转换为压缩音频文件的载体后,结果不会包含我们所做的所有更改。

PCM 代表脉冲编码调制,它以未压缩的数字格式表示音频信号。压缩音频不会精确重现原始 PCM 信号。

因此,引入了一个回读步骤,该步骤检查哪些比特成功写入了压缩文件,哪些没有。

此步骤会重复进行,直到所有比特都成功编码。

在编码过程中,有问题的比特会经过多个步骤,按顺序对连续的失败应用以下规则

  • 重新编码:稍微增加编码级别,以增加下一次迭代成功的机会
  • 强制加:编码比特以超过可接受标准并被丢弃(下一次迭代中最大值的合理性检查将失败,比特将被标记为跳过)
  • 强制减:与强制加相同,但用于最小值(较低阈值)

这导致多个块未被编码,从而容量降低,但随着时间的推移,越来越多的比特将被成功编码,直到完整消息最终嵌入。

您注意到,本方法依赖于“迭代方法”。

因此,跟踪“算法收敛”,在可接受/最大时间内达到理想结果非常重要。

所以,一个结束标准是允许的最大迭代次数,之后我们将中断并显示错误消息。

例如,当我们尝试嵌入一个文件太大的文件而无法放入载体时,可能会发生这种情况。请注意,我们互换使用“载体”和“容器”文件或信号。

下图大致显示了数据处理的顺序以及带有示例的文件生成

图 4:隐藏秘密消息的主要步骤(示例)

请注意,该程序仅直接读写未压缩的 .wav 文件。与压缩音频文件之间以及与压缩音频文件之间的中间转换借助外部工具 ffmpeg 完成。

如果您持批判性观点,您可能会认为使用这种尝试和错误或暴力破解方法不好。

但请考虑一下,机器学习和人工智能,以及许多现有算法,都以类似的方式工作。这同样适用于扩展处理时间,例如训练模型。

当前版本的代码以及为不同参数提出的默认值是多次测试和妥协的结果。

例如,在选择一个块中应包含多少样本时,我们需要考虑,一个块中的样本越多,我们需要编码的块就越少,但每个块中我们可以编码的频率就越多。

反之亦然。“最佳”值也可能取决于编码引入的“噪声”量以及为编码选择的频率范围。

目前,以下参数设置为这些默认值

  • chunk_len_samples = 480
  • interleaved_chunks = 2 # 插值需要 >1
  • interleaved_fc = 2 # 避免代码之间的干扰 >1
  • code_frequency_start_bin = 120 # fc0 = 120000 Hz
  • code_frequency_end_bin = 179 # fcN = 17900 Hz

为了理解特定频率分量的幅度是如何编码的,我们需要记住它由实部和虚部组成。

因此,为了编码特定频率下 FFT 的绝对幅度,我们通过乘以预定义的因子来修改实部 (Re) 和虚部 (Im)。

该因子是相对于该频率下原始幅度的“相对”值。

为了编码一个 1,我们乘以 CODE_FACTOR_PERCENT_MINUS,乘以 CODE_FACTOR_PERCENT_PLUS 将编码一个 0。

以下是在块 i 中为编码频率 fc 编码 1 的示例

code_sig3_chunk_FFT[i][CODE_FREQUENCY_START_BIN + fc] = 
interpolatedFFTn_real*CODE_FACTOR_PERCENT_MINUS + 
1j*interpolatedFFTn_imag*CODE_FACTOR_PERCENT_MINUS

由于参考 FFT 的实部和虚部可能会产生一个插值,其符号与该位置的原始值不同,我们在编码时考虑其符号以减少失真,例如

interpolatedFFTn_imag = abs(code_sig3_chunk_FFT_n[i - 1, fc].imag + 
diffFFT_n_imag / 2.0) * np.sign(code_sig3_chunk_FFT_n[i, fc].imag)

有了这个技巧,实部或虚部的代码是正数还是负数都不重要,只要绝对值(模)具有正确的幅度即可。

这是一个例子。

图 5:通过考虑符号()来减少编码噪声(示例)

为了在块 i 中编码一个 0,图 5 中的第一个图显示插值 A 应增加到 ZEROA,用“蓝色”十字标记。

或者,如果 Re(S2)i 的值变为 ZEROB(红色 X),我们将获得相同的模,从而仍然编码一个 0。

这在图 5 右侧的图表中可以看到,该图还显示了虚部(为简单起见,未显示 Im 的修改)。

请注意,如果我们将在 Re(S2)i 编码为 ZEROA,原始值的修改将非常大,导致强烈的编码噪声。这可以通过考虑符号来避免。

为了继续,所有编码的样本都应大于 SKIP_CODING_IF_MIN_EXCEEDED_DEFAULT。这确保了修改具有足够的幅度以在音频压缩中幸存下来。

编码引入的最大噪声已经来自插值,因此参数 INTERPOLATE_AND_DUMMY_CODE_ALL 最好设置为 false

在这种情况下,缺点是修改不会分布在整个音频信号上,从而增加了消息被编码的地方的噪声,这可能会给攻击者提供线索。

这可以通过例如通过增加参数 interleaved_chunks 来分散编码来解决。

我们使用 rfft() 来计算“实数”快速傅里叶变换,而不是 fft(),因为信号是真实的物理信号,我们可以应用更高效的 rfft()。对于“逆实数”FFT irfft() 也是如此。

其他细节,如归一化、缩放、日志记录、压缩和加密未在此处解释,但可以通过阅读 AS4PGC.py 来轻松理解,该文件包含许多代码注释。

消息提取从使用参数 -r 和隐写文件名调用工具开始。然后工具会要求输入密码。

如果输入了正确的密码,原始文件(包含秘密消息)将在同一文件夹中创建。

在消息提取过程中,首先解码头部以获取必要信息,特别是隐藏消息的长度。

然后执行一些合理性检查,如果需要,则解密和解压缩秘密消息。

有关更多详细信息,请参阅 AS4PGC.py 中的 read() 函数,该文件包含许多代码注释。

配置

如上所述,该程序提供了多种可能性来适应它,以根据您的需求改进结果。

为此,一个名为 config.ini 的文件可以方便地修改。

如果没有提供 config.ini 文件,将使用配置参数的默认值。这在大多数情况下都有效。

dataclass 变量 configuration 包含几个不同类型的参数,它们使用默认值进行初始化。

如果提供了配置文件,则在程序启动时会读取该文件,覆盖默认值。

一些其他参数,如“--no_encryption”和“--messupconfig”,可以作为命令行选项提供。

一些参数,如 SEED_IGNORE,将被伪随机修改,引入额外的欺骗步骤。

为此,使用从密码派生的密钥。

当提供“--messupconfig”时,一些配置参数会被“打乱”.

这确保了进一步的保护,使攻击者更难提取隐藏的消息。

最明显的参数在此不作描述,但以下列表提供了有关一些重要参数的详细信息

  • IGNORE_THRESHOLD 值为 0.99 将随机选择 1% 的块不进行编码
  • DO_IGNORE_SOME 激活 IGNORE_THRESHOLD 的使用
  • DO_DECEPTION 在忽略的块中编码虚拟比特
  • INTERPOLATE_AND_DUMMY_CODE_ALL 在原始秘密消息之外的代码虚拟比特
  • RECODE_FACTOR_PLUS 在“重新编码”失败的代码时应用的因子
  • CODE_FACTOR_PERCENT 以百分比表示的因子,用于增加 FFT 块的值以编码一个比特
  • CODE_FACTOR_PERCENT_DETECTION_THRESHOLD 低于该相对阈值,代码无效

头部

由于在提取/解码隐藏消息时其长度未知,因此需要使用头部。

头部将始终使用用户提供的密码进行加密。

在消息提取过程中,首先解码和解密头部以获取必要信息,特别是隐藏消息的长度。

然后执行一些合理性检查,如果需要,则解密和解压缩秘密消息。

是否压缩和/或加密了包含秘密消息的文件,以及原始秘密文件的名称,也已在头部中指定。

请注意,如果我们可以检测到隐藏消息的结尾,那么我们可能不需要头部。

但是,在这种情况下,如果我们使用秘密消息之外的虚拟代码,我们将需要一个特殊的标记来查找原始消息的结尾。

这反过来意味着,任何与特殊标记匹配的消息内容都需要先被替换。这有时会很麻烦。

因此,头部似乎是处理消息编码和解码的非常方便的工具。

下图详细显示了头部的字段

图 6:消息头部

欺骗

总的来说,由于有多层保护,我们可以假设攻击者将无法读取我们的秘密消息。

避免“检测”更困难。使用隐写分析,攻击者可能能够有一定信心检测到消息的存在。

他们也可能能够估计消息的近似大小。但这通常是他们能做到的极限。

当前技术非常安全,并确保没有人可以在未经授权的情况下读取您的消息(例如,没有密码、config.ini)。

尽管如此,我们仍应改进嵌入,以尽可能欺骗攻击者,同时不引入漏洞且不大幅降低容量。

为此,当前代码具有以下措施

  • 头部和隐藏的消息都已加密,从而增加了隐藏数据的熵
  • 可以“打乱”多个配置参数 - 需要可逆操作,因此不使用 SystemRandom()
  • 安全的伪随机二进制数组 deception[] 用于在忽略块和消息之外的块中编码虚拟比特
  • 头部中的随机填充字节(可逆操作)
  • 编码频率随机打乱,参见 random_f_shift[] - 在频域中欺骗的重要改进
  • 编码频率随机偏移固定量 - 参见 fc_offset[]
  • 随机忽略多个 FFT 块(参见 ignore[]

使用安全的函数 urandom()SystemRandom()(内部使用 urandom())是不可逆的。

这就是为什么,对于需要可逆的随机操作才能恢复原始消息的情况,我们需要使用不太安全的版本来生成随机数据。

这没问题,因为在那些情况下,我们还使用了源自密码的种子值。

注意:本文中的随机和伪随机词语互换使用,但我们始终指伪随机。

尽管“当前”这两个术语之间存在重要差异,但一些科学家认为,我们不确定“真正随机”意味着什么。

这导致了一个更具哲学性的问题:上帝是否玩骰子?

容量

对当前方法的粗略分析表明,“编码容量”远低于例如在 .WAV 文件上考虑 LSB 编码时获得的容量。

如果我们假设我们可以在单声道 .WAV 文件的每个样本中通过 LSB 编码 1 比特信息,那么假设采样率为 48 kbps,我们每秒可以隐藏 48000 比特。

如果音频样本的分辨率为 16 位,那么我们编码 16 位中的 1 位。

现在,当使用当前方法编码 MP3 文件时,情况如何?

一些测试达到了每秒 1200 比特的编码容量。那么,每个音频样本中有多少比特?

这些测试是在 320 kbps 的质量下进行的,这“相当于”每秒 20000 x 16 位样本。

这大约相当于与 LSB 编码在 .WAV 文件上获得的编码因子相似。

但这个等效结果对于采样率低得多的情况(20kbps vs 48kbps)是有效的。

如果我们现在考虑到将 MP3 数据转换回 PCM 时确实获得了 48000 个音频样本,我们可以得出结论,我们只编码了 48000x16 中的 1200 比特,这导致因子为 640(与 LSB-WAV 相比的因子为 40)。

这听起来更合理,似乎我们可以隐藏的信息比 LSB-WAV 少 40 倍。但是,文件的大小呢?我们在这里公平吗?

当考虑 .WAV.MP3 音频文件的最终字节大小时,我们再次发现因子 2.4。也就是说,如果 .WAV 文件的大小例如是 1440 kB,那么 .MP3 文件只有 600 kB。

即使在这种情况下,我们仍然比 LSB-WAV 差 16.66 倍。

这就是您想使用最普遍的音频格式(它们使用有损压缩)必须付出的代价。您可能永远无法做得更好。

请注意,容量将很大程度上取决于实际配置。

也就是说,它将取决于每个 FFT 块中的音频样本数量、用于编码的频率数量、跳过的块数量等。

滤波

默认情况下,BSF_MIN_ATTENUATION_DB 设置为值 85,这不仅激活了带通滤波器,而且将其设置为相当强的衰减。

但是,有什么问题呢?

带通滤波器的衰减决定了在实际编码之前,从原始载体中移除多少音频信号在用于编码的频率范围内。

一方面,这有助于消除载体内容与嵌入比特之间的“干扰”,另一方面,这会减少编码信号的隐藏。

因此,这项功能应谨慎使用,例如,设置一个衰减,该衰减足以很好地隐藏我们的编码信号,同时载体不会对其造成太大干扰。

在某些情况下,滤波可以帮助避免收敛问题,例如,当我们以非常低的电平对载体中在该范围内具有强音频内容的载体进行高频编码时。

滤波器衰减应选择为算法收敛和代码隐藏之间的折衷。

为了方便起见,默认设置了较高的最小衰减。这将为大多数用户简化编码,但代价是与攻击者/隐写分析者相比,隐藏性有所降低。

代码

代码是用 Python 编写的,与 Python 版本 3.6 到 3.9 兼容。

在 Windows 10 和 Linux Mint 20 上进行了多次测试。

当前版本的代码在 PyPi 中标记为开发状态 4 - Beta。

在本文顶部,您可以找到 GitHub 项目的链接,并且还提供了 .zip 文件供下载。

借助批处理文件 gen_exe_with_pyinstaller.bat,可以使用 pyinstaller 生成可执行文件。

模块描述

在此处,您可以找到有关 AS4PGC.py 中代码的简要信息

  • # 代码的第一行:定义,加载/创建 config.ini
  • # print_progress(..):打印进度条
  • # write():将消息隐藏在载体中并输出结果到隐写文件
  • # read():从隐写文件中提取隐藏的消息
  • # main():如果使用 -w 选项则调用 write(),如果使用 -r 选项则调用 read()
  • # psnr():计算峰值信噪比
  • # snr():计算信噪比
  • # nextpow2()freq_shift() 的辅助函数
  • # freq_shift():使用 SSB 调制对信号进行频率偏移

持久化解决方案

如果您查看文章 AC4PGCAC4QGP,您会注意到一个“模式”。

AC4PGC 和 AC4QGP 中描述的安全离线设备输出模拟电信号,在不安全的一侧,这些信号随后被数字化并在 VoIP(压缩)等特定数据格式上传输。

然后,整个过程在接收器中反转,并恢复原始模拟电信号。该电信号包含加密的二进制消息,只能在离线设备中解密。

传输通道可能因情况而异,例如 PSTN、无线电链路等,中间信号可能经历不同的转换。但最终,原始模拟信号会得到恢复(带有一些干扰)。

在本文中,此技术可以被视为 PCM 格式的音频信号的输入和输出。

在此期间,即在压缩音频文件中,可以使用不同的格式,并且可能会添加一些干扰。但这只是传输介质。

当考虑将压缩音频文件作为通信通道时,模式出现了,类似于 AC4PGC 和 AC4QGP 中的 VoIP 传输。

通过这一点,我们注意到解决方案侧重于“信号特性”,并且与具体的技术

  • 压缩技术
  • 算法
  • 编解码器
  • 实现(工具、编程语言)
  • 用于压缩/格式转换的参数
  • 应用的标准
  • 协议和数据格式

因此,我们可以预期本技术(不一定是本技术的当前“实现”)在遥远的未来仍然适用。

上述模式可以描述为:将数据从 A 发送到 B,“克服通信通道/不安全路径”,而不知道中间发生了什么。

也就是说,通信通道的具体特征,即使提前知道,也不是很重要。只有信号处理才重要。

例如,考虑使用 .OGG.MP3 进行压缩,这两种是完全不同的压缩算法。

与 MP3Stego(一种隐藏数据在 MP3“内部”的软件工具,并且仅适用于 MP3)相反,AS4PGC 的消息嵌入和提取在 MP3 和 OGG 两种情况下都可行。无需更改。

还可以克服其他几种格式,甚至未来尚未存在的压缩格式。它们都可以被视为通信通道的干扰。

当然也有局限性,本文从理论角度展示了需要考虑的事项,也从具体实现的角度,考虑了编程语言、外部工具、格式、设置等。

与 MP3Stego 等直接方法相比,我们为这种灵活的方法和持久化解决方案需要付出的代价是

  • 增加了时间(隐藏/恢复秘密消息需要更长的时间)
  • 增加了噪声(虽然人类仍然听不见,但信号中的修改在进行隐写分析时可能更明显)
  • 容量减少(可以隐藏的消息大小较小)

健壮性

本章留作日后更新本文的提醒。

隐写方法评估包括针对多种攻击的健壮性测试。

我们已经提到了隐写分析,这是一种用于确定隐写文件是否包含隐藏消息的分析方法。

我们可以使用不同的技术来改进隐藏,但还有其他攻击涉及对隐写文件的“修改”,例如在通过电子邮件传输文件的过程中。

一个例子是改变隐写文件的音量,但还可以进行其他各种攻击,如重采样、LP 滤波、回声添加、噪声添加。

但有一点可以提前说,这种技术的健壮性可能不是很强。

隐写文件中的轻微变化可能会损坏隐藏的消息,尤其是当它被加密时。

存储未加密的冗余信息等可能的解决方案可能会提高健壮性,但这需要进一步研究。

因此,未来可能会在实现中添加进一步的改进。

应用

在这里,您可以找到一些存储和/或共享秘密消息的想法

  • 短信
  • 密码、银行 PIN 码、QR 码图片
  • 数字证书
  • 重要电子邮件
  • 小型计算机程序
  • 医疗记录
  • 指向“未列出” YouTube 视频的网页链接
  • 低分辨率照片
  • 任何您想安全保存的(几 KB 大小)的小文件
    • 税务申报
    • 银行账户摘要
    • 月度开支
    • 联系方式:电话号码、电子邮件地址、邮政地址……

如果秘密文件太大,您可以将其拆分成小文件并存储到不同的载体文件中。分割 zip 文件可能是最简单的选择。

Zip 文件可以额外使用不同的密码进行加密。此加密是在本文所述方法中应用的加密之上进行的。

关于网络安全

隐藏信息的事实并不能让我们免除应用网络安全措施。

此代码可以在 Windows 中使用 audit_code.bat 进行分析,该脚本使用两种不同的工具评估代码的漏洞状态:banditsafety

结果存储在 audit 文件夹中。这些命令也可以在 Linux 终端中执行。

目前,代码中只有“低”严重性问题,这些问题不关键或不相关。相应的注释和理由可以在代码中找到。

引言 章中,提到了加密的几个危险,这可能证明使用额外的措施(如隐写术)是合理的。

另一个重要且鲜为人知的问题是终端节点问题,例如,它可能允许攻击者在您输入加密密码时窃取它。

不幸的是,使用当前工具,您仍然需要担心终端节点安全。

以下文章描述了一些克服此问题的方法

  • AC4QGP(使用数据二极管和加密)
  • AC4PGC(使用数据二极管和隐写术+加密)

关于隐写分析

关于隐写分析,这可能是对该技术最大的威胁,读者应意识到隐写分析的主要目标是就文件是否隐藏了隐写负载“做出概率陈述”。

得出 90% 的陈述已经非常好,但远非“证明”您的文件实际上包含隐藏信息。

无论如何,隐写分析很少能够准确地恢复隐藏的消息。

即使它做到了,在极端情况下,攻击者也需要开始破解您的“加密”消息。这样就回到了仅使用加密的起点。

以下列表显示了攻击者需要跨越的障碍

  • 找出您的文件是否包含任何隐藏消息(使用隐写分析
  • 恢复/提取消息
  • 解密消息
  • 如果消息是加密的 .zip 文件,那么“解密 .zip 文件”
  • 证明确实是您最初隐藏了消息!(不可否认性

后续步骤

下一步的列表很长,但为了完整起见,将其提供如下

  • 使用多项式而不是 modulo()(过于直接)或 random()(不起作用)来打乱块——可能因为太多随机细节无法在 mp3 中可恢复地压缩
  • 在以下方面增加更多打乱:块之间的间隔、块中的样本数、用于平均插值的块、代码阈值等。
  • 立体声支持
  • 支持更多音频格式
  • 编码 FFT 序列的“导数”:将现有概念证明移植到 Python - 是的,该方法有效!……使用一个技巧……
    (编码 FFT 序列的导数有一些优点,例如产生的噪声更少,并且信息隐藏在另一个域中)
  • 使用其他“可逆”函数在不同域(类似于上面的 FFT 导数)进行编码,例如 histogram()
  • 考虑 CDF 的最小/最大值进行编码
  • 噪声平滑
  • 一次性密码:带有噪声、音乐或密码本
  • GUI 作为 CLI 工具的前端,用于设置参数、指定文件、密码、自动化多个文件的嵌入、应用 AI 等。
  • 炫酷的 3D 图(太慢?)
  • 使用 moviepy 将秘密消息隐藏在视频的音频中!
  • 音频隐写流媒体,例如使用蓝牙
  • 应用网络安全措施来保护工具本身(例如,加密 config.ini
  • 默认嵌入头部,以隐藏 config.ini 的值,其中存储了用于隐藏消息的不同嵌入参数,因此只需要密码,不再需要“外部”config.ini。缺点:头部始终以相同方式嵌入,因此更容易被隐写分析检测到?
  • 时间掩蔽:编码具有较高幅度的接近频率(同时播放的音调)
  • 根据配置跳过强制,例如,将要跳过的块/位置(相对或绝对)存储在头部
  • 一次隐藏“多个”秘密消息
    该方法可以轻松扩展以隐藏 N(N>1)条消息,每条消息都有其自己的密码和设置(部分)。
    消息可以一个接一个地编码,甚至混合编码,使用互补频率。
  • 使用机器学习:参数、值范围及其组合的大量相对数量可能对该方法的结果产生重大影响。与往常一样,可以通过调整/微调参数来根据需要平衡健壮性、容量和隐藏级别。为此,可以使用 config.ini 文件。但是,我最近几周的经验表明,一些结果确实非常违反直觉,并且参数之间的依赖关系有时很难理解。这就是我开始认为“机器学习”可能是优化结果的一个好方法的原因。如果我们向模型输入适当的参数,机器学习算法就可以取代人类,一遍又一遍地进行迭代优化,直到找到一个产生最佳结果的配置。所有这些都自动发生,从而将人类从这项繁琐的工作中解放出来,并取得更好的成果。一些需要考虑的特征是
    • 文件大小

    • 消息大小

    • 音频时长

    • 时域和频域中的信号特性

    • 音高

    • 目标 SNR

    • 滤波器设置(如果有)

  • 将方法应用于其他域(例如图像文件)的转换工具

几年前,我使用 C# 和 Visual Studio 实现了一种类似本文所述的技术。效果非常好,但最大的“发现”是能够将该方法应用于图像文件而不做任何更改。

诀窍是首先将图像文件转换为音频以按常规应用过程,然后转换回 .JPG 以获得最终的隐写图像文件。

分析工具显示 MP3 音频和 JPG 图像隐写文件都取得了非常好的结果。也就是说,在中等编码密度下,文件没有显示出可见的统计特征。我记得识别率低至 <2%。

这意味着,文件可能持有隐写负载的嫌疑非常小。

这种跨域功能甚至可以扩展到其他域,如传感器发出的信号。

转换步骤序列如下

.JPG → .WAV (carrier)
         | CODE
         v
.JPG ← .WAV (stego)

替代工具

在这里,您可以找到 Stego-tool-kit 的链接,其中包含有关 MP3StegoAudioStegoDeepSound 的信息,这三个是可能的替代工具。此外,还提供了经典工具隐藏图像信息的良好概述

https://github.com/DominicBreuker/stego-toolkit

在那里,您还可以找到 issue24,其中提到

与另外三个音频工具(MP3StegoDeepSoundAudioStego)相比,AS4PGC 具有一些优势

  • + 通用方法,因此支持多种格式(MP3、WAV、FLAC、OGG 等)
  • + 可作为 .exe 文件和 Python 模块提供
  • + 在 PyPi 上可用,可通过 pip 轻松安装
  • + 真正适用于 MP3 格式(DeepSound 似乎不适用于 MP3,AudioStego 会产生非常强的哨声!)
  • + 在 Windows 和 Linux 上运行
  • + 图表以帮助跟踪处理步骤(对开发者有用)

在其当前版本中,它存在一些缺点

  • 速度慢(隐藏需要音频时长 3 到 20 倍的时间)
    注意:隐藏时间主要归因于 ffmpeg 文件转换。
  • MP3Stego 更多的失真/噪声

图像和视频库

图 7:迭代

图 8:消息之外的代码(虚拟代码)

图 9:仅代码消息

图 10:频率分析

推荐文章

沿着在线隐私的主题线,以及您可以采取哪些措施来保护它,您可能还想查看以下文章

AC4PGC - Pretty Good Concealing 的音频聊天

AC4QGP - Quite Good Privacy 的音频聊天

IP Radar 2 - 实时检测和防御恶意网络活动

总结

提出的隐写技术及其作为命令行工具的实现将来可以改进,但它们已经是支持公众主题的重要贡献,与以前现有的开源和免费解决方案相比具有许多优点。

有了这个工具,隐写术再次证明了其在网络安全和隐私方面的价值,是“密码学的宝贵补充”。

谨慎使用并了解其局限性,AS4PGC 不仅仅是一个小工具,它在各种情况下提供了保护隐私的有趣方式。

下次您出于任何原因向某人发送加密信息时,请考虑这种替代方案是否也能满足您的需求。而且,谁知道呢,它甚至可能为您提供您迫切需要的额外保护!

兴趣点

借用 Andy Yen 的几句话

“我们在这里看到的只是第一步,但它表明随着技术的进步,隐私不必很困难,不必有破坏性。最终,隐私取决于我们每个人。我们现在必须保护它,因为我们的在线数据不仅仅是零和一的碎片。它实际上比这多得多。它是我们的生活,我们的个人故事,我们的朋友,我们的家人,在某些方面也是我们的希望和抱负。所以,现在是我们站起来说的时候了:是的,我们确实想生活在一个有在线隐私的世界里。是的,我们可以共同努力将这一愿景变为现实!”

历史

  • 2021 年 9 月 24 日:文章发布
© . All rights reserved.