我想知道是否有一种防弹方法来知道是否成功解密了文件。

例如,假设我加密了一个文本文件,并使用3个字母的密码来保护它。我使用蛮力将其解密,但是两个不同的密码导致一个包含英语可理解文本的文件。有没有办法让我知道原始的是哪一个?换句话说,有没有一种可靠的方式可以知道我是否正确输入了密码?

评论

您检查身份验证标签。您确实使用了身份验证加密,对吗?

相关我可以确定用户是否使用了错误的对称加密密钥吗?

有(可能是)加密形式,它们依赖于成功解密和未成功解密的数据的不可区分性。请参阅:en.wikipedia.org/wiki/Deniable_encryption。

@Gloweye不一定是真的。它可能适用于英语散文,但机器数据看起来都一样。例如。金融交易信息,温度等信息。有大量的候选数据看起来都令人信服,但却是错误的。它也取决于信噪比,因为您可以在本底噪声以下进行传输。

@PaulUszak,不是所有机器数据。许多文件格式具有幻数,甚至包括校验和,并且某些结构可以进行某种程度的验证(对象的长度合理,任何类型字段均未使用未定义的值,等等)

#1 楼

从应用程序设计人员的角度来看:是,通过使用经过身份验证的密码(如AES-GCM或crypto_secretbox_xsalsa20poly1305),无论如何都应该这样做。请参阅scrypt工具以获取仅此用途的应用程序示例:使用经过身份验证的密码使用从密码派生的密钥对单个文件进行加密-具体而言,该工具在加密然后由MAC组成时使用AES-CTR和HMAC-SHA256 ,但如今,使用AES-GCM或crypto_secretbox_xsalsa20poly1305几乎总是比较容易。


从对手的角度来看:如果没有更多有关明文的信息,就不能说。

实际上,在大多数应用程序中,即使应用程序愚蠢地不使用经过身份验证的加密,纯文本也具有某些可识别的模式。例如,HTML文档通常以<html><!DOCTYPE开头;电子邮件通常具有标头,并限制为7位US-ASCII。

通常,只有在以下情况下,我们才认为加密对机密性(在IND-CPA的正式意义上)是安全的:即使对手可以选择模式,对手也无法在给定密文的明文中区分模式。当然,只有3个字母的密码才允许使用很短的蛮力攻击,因此我们不认为这可以提供任何有意义的安全性。



我使用蛮力来将其解密,但是使用两个不同的密码可以得到一个包含英语可理解文本的文件。



再次从对手的角度出发,让我们假设没有身份验证器来验证解密,并且您正在寻找的模式原因是文本全为7位US-ASCII。实际上,您可能正在寻找一种模式,该模式在所有位串的集合中都比较稀疏,但这很容易量化。

我们可以合理地将错误解密的每个字节建模为独立的统一随机变量,因此,错误解密中的每个字节都有$ 1/2 $机会独立为7位US-ASCII,并且如果您的文件长$ n $个字节,错误解密中的所有字节都是7位US-ASCII的机会为$ 1/2 ^ n $。

在密码术中,当事件的概率远低于$ 1时,我们通常认为事件“不会发生” / 2 ^ {100} $。如果随机地均匀地选择了$ 2 ^ t $个密钥(例如,对于AES-256或Salsa20,为$ 2 ^ {256} $),那么在此模型中,您只需要花$ 100 + t $个字节就可以停止担心了。错误解密带来的任何误报-也就是说,如果此模式的误报率最多为Poly1305等密码验证器的误报率。

但是,如果您以某种方式发现自己遇到了两个都符合您所有条件的候选纯文本,那么,密码学中没有什么可以帮助区分它们,因此您必须使用外部信息来帮助您做出决定。


该模型假设密钥实质上小于消息,并且密码系统不会被相关密钥攻击无可避免地破坏;例如,当密钥是一次性键盘时,它会崩溃,但是对于AES-CTR或Salsa20,这是一个合理的模型。具体来说,让$ K $是正确猜测密钥的事件,让$ A $是密文在US-ASCII候选密钥下解密的事件。假设是$ P(A \ mid K)= 1 $意味着真正的明文是US-ASCII。根据贝叶斯规则,

\开始{align *}
P(K \ mid A)
&= P(K)\ frac {P(A \ mid K) } {P(A)} \\
&= P(K)
\ frac {P(A \ mid K)}
{P(A \ mid K)P(K) + P(A \ mid \ lnot K)P(\ lnot K)} \\
&= \ frac {P(K)} {P(K)+ P(A \ mid \ lnot K)(1 -P(K))} \\
&= \ frac {1} {1 + P(A \ mid \ lnot K)(1 / P(K)-1)}。
\ end {align *}

关于密码的其他建模假设是$ P(A \ mid \ lnot K)= 1/2 ^ n $。如果我们假设密钥在$ 2 ^ t $个可能性中均匀分布(例如,对于Salsa20或AES256-CTR,$ t = 256 $),使得$ P(K)= 1/2 ^ t $,则该值减小为

\开始{等式*}
P(K \ mid A)
= \ frac {1} {1 + 2 ^ {-n}(2 ^ t-1)} 。
\ end {equation *}

当$ n t $使得$ 2 ^ n \ gg 2 ^ t-1 $时,这大约是$ 1-2 ^ {-n} $,并且随着$ n $的增加而快速收敛到1,并更多地确定密钥必须与模式匹配的纯文本字节。

评论


$ \ begingroup $
下降投票者会在乎解释您不同意的答案吗?
$ \ endgroup $
–吱吱作响的s骨
19年11月13日在2:57

$ \ begingroup $
不要忘记,有人可以利用这两个看似有效的结果。例如,如果消息可以解密为“启动”或“安全”,则在正确的时间使用正确的密钥可能是一种利用。对您的对手显示“安全”以表明您的消息是良性的,但对您的同胞则显示“启动”以攻击这些对手。因此,尽管可能性很小,但存在被利用的可能性。
$ \ endgroup $
–长长的脖子
19年11月13日在21:51

$ \ begingroup $
文件签名不起作用,因为您同样可以错误地解密为具有相同签名的另一个文件。极端情况是OTP,即相同长度的所有明文都具有一个相应的密钥,该密钥将从该长度的任何密文中产生它们。
$ \ endgroup $
–橙色狗
19年11月14日在16:43

$ \ begingroup $
@StopHarmingMonica糟糕-是的,我简化了分析。现在修复并详细说明,并阐明建模假设。
$ \ endgroup $
–吱吱作响的s骨
19年11月14日在18:04

#2 楼

不,没有防弹方法,但是,有一些方法可以实现这一目标。

首先,看一下问题;考虑$ \ operatorname {AES}:\ {0,1 \} ^ {k} \ times \ {0,1 \} ^ {128} \ to \ {0,1 \} ^ {128} $其中$ k $ *可以是128,192和256位。

每个密钥表示(选择)一个排列,并用每个可能的密钥解密都会产生所有可能的文本,无论有意义与否。因此,您将得到一些假阳性结果。为了消除这种情况,您可能需要其他块。来自一个块的较长消息将减少可能的候选密钥。由于拥有全部是可理解的障碍的可能性将降低。

历史上,RSA系统给我们带来了很好的挑战;在DES挑战中,攻击者获得了一些有关纯文本和填充信息的初始信息,以确保他们找到了正确的密钥。

最简单的方法是在文件中使用固定文本,以便您可以知道该密钥可以是正确的。 VeraCrypt中使用的一种类似方法,可以通过密钥测试PRF和加密算法的所有可能组合,以便如果前4个字节的解密包含ASCII字符串VERA,则该字符串被认为是成功的。

另一种常见的方法这样做的方法是使用诸如AES-GCM的身份验证加密(AE)模式,您可以检查标签以更正解密。可以忽略的可能性是,使用错误的键可以正确设置标签,但通过进一步的忽略可以使文本有意义。

可以将AE与固定文本结合使用。同样,固定文本可以用作AEAD中未经加密但经过身份验证的关联数据。使用正确的密钥,标签将正确。如果使用不正确的密钥,则最终获得正确标签的可能性很小。

*我假设您实际上拥有一个良好的密码,并且具有像Argon2这样的良好KDF。一个好的KDF使用不同的密码将产生不同的密钥,直至达到信鸽原则。用两个不同的密码派生相同的密钥很困难,而找到一个是一件文章。

评论


$ \ begingroup $
“如果拥有良好的KDF,则使用不同的密码将导致使用不同的密钥。”违反信鸽原则。
$ \ endgroup $
– Ben Voigt
19年11月14日在20:47

$ \ begingroup $
@BenVoigt您说得对,需要更多说明。谢谢。
$ \ endgroup $
– kelalaka
19年11月14日在20:54

#3 楼


我想知道是否有一种防弹方法来知道是否成功解密了文件。
我用蛮力将其解密[...]是否有一种可靠的方法来知道我已经输入正确的密码吗?


给定适当的文本文件长度,这是防弹的。

对于过于简单的解释:

可以理解的英语文本的纯文本比例随文本长度的增加而呈指数递减。

近似为零:您需要大约1.3位/字母来编码英语文本(关于这是否会编码可理解的英语文字...好吧,这是另一回事。但是,再次近似一下。因此,您可以容纳〜4个字母/ 5位或〜32个字母/ 40位。也就是说,可以在5个字节中存储约32个字母。

同时,ASCII是8位/字符。 (或者7,但也是第一次近似。)因此,在这5个字节中,可以存储... 5个字母。这意味着,以零为近似,每当您在消息长度中增加5个字节时,您就有〜5/32的机会保持英语文本的可理解性。

这是另一种方式。如果我有1KiB的随机数据。可以理解的英文文本的概率大约为零,大约是10 ^ 160中的1。

如果我有256位密钥,那么大约有10 ^ 77个可能的密钥。因此,对于第一近似值,存在第二个密钥可以从您的1KiB文本加密副本中生成可理解的英语纯文本的概率为10 ^ 83中的〜1。 (每个其他键都会产生“随机”样的输出,并且您有〜10 ^ 77尝试获得1-in-10 ^ 160的机会。)

这是“成功猜测哪个粒子在宇宙中,我选择了“存在碰撞的概率级别”。



但是可以说,这确实是荒谬的,并且有两个键可以从您的数据中产生可理解的英语文本。

我们开始涉足亿亿级计算。 (有时还是让我感到惊讶。)假设我们有一台计算机,可以每秒执行1 exa解密,并检查结果是否为英文文本。大约是每秒10 ^ 18次解密。假设它正在尝试随机密钥。它需要多长时间才能到达解密密钥?数学很简单...比宇宙的寿命还要长得多。

好吧,这还不够。如果我们将地球变成了有机物怎么办?布雷默曼(Bremermann)的极限为地球提供了约10 ^ 75次操作/每秒的最大值。实际上,这有点理智-一两分钟。

再次使用256位密钥。


暂时假设使用较大的密钥。足够大,以至于可能有多个键可以映射到英语解密的文本。

使用我们的百亿亿台计算机,我们找到映射到英语解密的文本的密钥要多久?比宇宙的年龄还要长得多。

我们的天体地球?仍然比宇宙的年龄还要长得多。

...可观测的宇宙?还不够。除非您愿意至少等待10 ^ 40年。

因此,即使键足够长,以至于有多个键可以将英文文本作为输出,即使即使对手拥有整个可观察的宇宙。而且,如果对手拥有的不只是可观察的宇宙,那么您可能还会遇到其他问题。


总而言之,对于任何体面大小的文件,如果解密就可以假设是非常安全的它采用了不错的加密算法,并获得了正确的英文密钥。

更长的文件将产生更加愚蠢的结果。


请注意,这里有几个假设:


使用的加密算法实际上是安全的。
明文的大小是“足够长”。
您的明文有一个足够低的熵/位。这多少有点关系到2。


如果您的明文被压缩,则可能会引起问题(完美的压缩算法的输出实际上几乎可以从定义上与随机数据区分开)。
这也意味着例如Raw:不允许后跟未编码的原始字节


如果这样做,那么看起来像有效明文的随机数据概率就变得微不足道了。


>



#4 楼

我不知道为什么以前的答案都没有提到可否认的加密,这是Yonatan在评论中提到的。可否认加密的一个固有特征是,无法确定密文是否已使用正确的密钥解密!实际上,可否认的加密是实际上保护非常敏感的信息的最佳方法。这是一个简单的说明性示例:给定长度为$ n $的字符串$ x $,我们将使用任何强加密来加密它得到长度为$ n $的字符串$ y $,并将其嵌入长度为$ 1000n $的字符串$ s $的某些位置,其其他字符是随机的,其中位置的形式为$ 1000k + c $其中$ c $是由密码确定的常数。应该清楚的是,只要我们选择密码,以便每个字符串具有不同的偏移量$ c $,我们可以使用相同的方法将多个加密字符串嵌入到同一最终字符串$ s $中,每个字符串使用一个密码。 。当然,我们不会透露嵌入了多少个加密字符串,而且即使我们透露了一些密码,攻击者显然也无法从密文$ s $中知道有多少个密码,因为其余密码$ s $中的字符串仍然会随机出现。 (但是,如果您是间谍,则可加密也可能会对您不利,因为即使您泄露了所有密码,敌人也可能永远不会停止虐待您,因为它们确实不知道您是否拥有...)

另一方面,如果您正在谈论一种特定的文件加密方法,那么它当然可能无法接受,但是您的问题尚不清楚,并且缺少重要的背景信息。

评论


$ \ begingroup $
有一个与蜂蜜加密有关的概念。
$ \ endgroup $
–迈克罗
19年11月14日21:00

$ \ begingroup $
@Mikero:这是一个有趣的想法,尽管在我看来对于普通大小的文件来说是不切实际的。问题仅仅是密码空间太小而不能覆盖“合法明文”的整个空间,即使后者是已知的并且易于索引。例如,假设我们要加密以文本格式存储的1 MB英文书。那是大约一百万位的熵,因此,为了能够均匀地覆盖明文空间,将需要使用每个具有大约一百万位的随机密码。因此,似乎可否认的加密对于长明文更好。
$ \ endgroup $
–user21820
19年11月15日在2:40

#5 楼

作为基本的(阅读:数学)概括,我相信不是。适用于一次性填充加密方法的相同证明似乎也适用于此概念。

例如,
说您加密短文本。您使用一次性垫方法。然后您扔掉钥匙,突然对整个事情产生失忆症。

TL; DR ...起始信息永远消失了。

每个人(包括您在内)现在有些乱码,长度与明文相同。我们将其称为密文,并且根据OTP的证明,它不会泄露密钥或明文。

我们现在使用功能强大的计算机对密文进行暴力破解。我们当然会得到真正的明文……但这只是获得所有可能的明文(包括任何其他英语)的副产品。

现在,根据密码证明,它似乎也得到证明我们只剩下将一种候选明文与其他候选明文进行比较的方法。这是因为我们所有的强行强制文本都不会泄露密钥或真正的明文,就像密文一样。

当我们开始添加信息时(假设知道明文是英语),我们可以完善我们的识别和比较候选明文的方法。并且,在实际实践中,这就是这样做的方式。 (请参阅其他答案)但是,最关键的是,我们似乎必须添加更多外部信息才能执行此操作。 Q.E.D