是否有一种加密算法允许单个有效负载根据密码具有两个不同的输出?

信息安全 加密 密码学 隐写术
2021-08-12 09:59:11

假设我有一些加密的机密信息,并且我被迫/被迫披露该密码。

我的目标是使解密的有效负载看起来有意义/并且密码有效。

是否有任何此类算法允许将不同的密码应用于相同的有效负载,以便公开备用解密数据?

4个回答

这里的理论问题是大小/熵问题。关键规则是加密消息的熵与初始消息的熵相同。如果算法不涉及压缩,则加密消息的大小就是原始消息的大小。

对于加密的消息以两种不同的方式解码,具体取决于您需要的密钥,它包含 2 条不同的消息。一种方法是用一个密钥加密真实消息,用另一个密钥加密假消息,然后将两个编码消息(在填充较短的部分之后)结合起来,例如每个都一个字节。如果您在加密消息之前在消息的开头添加一个已知 ID,那么在解码时,算法只能返回具有正确初始 ID 的消息。

问题是有两条不同的消息+一些附加信息。并且拥有比初始消息更长的加密消息并不是那么合理......

这就是为什么我不知道实现似是而非的否认算法的原因,而只有容器,它是一个完整的加密文件系统。这是在停止支持之前在优秀的TrueCrypt中实现的。幸运的是,该项目的一个分支仍然提供它,VeraCrypt

VeraCrypt 实际上提供隐藏卷。实际上,普通卷的一部分空白空间用于存储具有不同键的不同卷。当您出示密钥时,会尝试查找隐藏的卷,如果没有找到正常的卷。当您在正常模式下打开普通卷时,没有什么可以猜测它还包含一个隐藏卷,只是它有一些未使用的空间,这对于文件系统来说并不奇怪。当然,如果你在那种模式下写入大量数据,你会覆盖并肯定会破坏隐藏卷数据。但是存在一种特殊模式,可以同时提供两个键并使用外部卷,而不会覆盖内部卷。


以上是技术部分。但是合理的否认也需要外部容器的内容是值得的,因为隐藏容器的能力是一个众所周知的特性。恕我直言,有两种可接受的方式:

  • 将您的信息分为 3 类,简单、敏感和秘密,并相应地存储它们:容器外简单,外部敏感(使用双重密码访问)和隐藏部分秘密。这样,由于外部容器包含的不仅仅是无辜文件,隐藏容器的存在并不明显。但是您必须实际使用外部容器,至少与内部容器一样多,并准备好公开其内容

  • 使用外部容器作为您的主要存储。这是公司笔记本电脑的常见用法,因为它确保在笔记本电脑被盗或丢失的情况下,不会立即访问任何机密信息(解决安全的机密部分......)。背面是您应该在启动时将容器作为单个容器安装,并且在正常使用中立即卸载它以在模式下手动重新安装它。

根据对手是谁 VeraCrypt 关于隐藏卷的合理否认安全要求的页面有额外的建议,例如从只读 CD/DVD 引导时只使用隐藏卷......

像往常一样,技术安全只是全球安全的一部分。如果信息足够敏感以至于您可能会担心自己的身体完整性,那么您应该使用物理安全措施,而不是仅仅依靠看似合理的否认:它是一个很好的工具,可以帮助隐藏安全信息,但不是神奇的灵丹妙药。只有蛇油公司可以提供这些...

使用许多常用算法,通过更改密钥,很有可能在第一个块中获取任意数据。当数据长于关键块大小时,您会遇到麻烦。假设您使用的是安全链接方法,其余数据(第一个块之外)在交换密钥后看起来是随机的。您可以使用不安全的链接方法,但我不推荐它。

您可以使用XOR OTP 加密这与在数学上重复使用密钥的大多数加密不同。使用 OTP(One Time Pad)时,密钥与数据的长度相同。使用 XOR(最常见的 OTP 之一),您可以灵活地任意生成所需的消息。
(你的对手可能知道这种可能性?)

首先,创建相同长度的文件:

  • 原始信息
  • 随机数据(真正的密钥)

XOR 一起给你

  • 加密信息

然后拿

  • 假消息
  • 加密信息

XOR 一起给你

  • 假钥匙

要解密,请采取

  • 加密信息
  • 真钥匙或假钥匙

XOR 他们得到

  • 真实或虚假的信息

正如@Alpha3031 评论的那样,您实际上可以使用传统的 AES 加密一条消息(例如假消息)(更常见,并且需要更小的密钥文件),然后使用 XOR(不太常见)来生成另一条消息。(例如真正的信息?)

XOR 可以应用于任何足够不可预测/随机的文件。(例如加密数据)

密码伪装

CA Technologies 已为一项称为Cryptographic Camouflage的技术申请了专利。

公钥密码学的一个敏感点是如何保护私钥。我们概述了一种使用密码伪装保护私钥的方法。具体来说,我们不会使用太长而无法进行穷举攻击的密码来加密私钥。相反,我们对其进行加密,这样只有一个密码才能正确解密它,但许多密码会解密它以产生一个看起来足够有效的密钥来欺骗攻击者。对于某些应用程序,此方法保护私钥免受字典攻击,就像智能​​卡一样,但完全在软件中。

所以是的,您可以获取一条消息(在这种情况下是一个密钥),并以这样一种方式对其进行加密,即有一个正确的密钥和许多产生虚假明文的“假”密钥。

您要问的是如何在基于秘密的加密之上实现合理的否认。虽然没有特定的算法可以做到这一点,但您可以在应用程序级别轻松实现 - 只需将两个对称容器组合在一起,然后在每个容器上尝试每个密码。

我记得 TrueCrypt 过去有这样的功能,尽管不确定他们的实现是否像我建议的那样或以其他方式实现。