【问题标题】:Openssl file decryption error bad decrypt. Wrong key or incompatible version of Openssl?Openssl 文件解密错误错误解密。错误的密钥或 Openssl 版本不兼容?
【发布时间】:2017-10-11 00:06:48
【问题描述】:

我一直在尝试解密几年前我加密的文件。我不记得密码了,所以我一直在浏览我当时可能使用过的潜在密码列表。其中一个密码产生的错误与我使用任何其他密码得到的错误不同。

是否有可能我找到了正确的密码,但还有其他问题?

这是我使用的命令:

openssl enc -aes-256-cbc -d -a -in <in.aes-256-cbc> -out <out> -k <password>

我有这个文件的 11 个潜在密码。对于 10 个密码,该命令返回错误:

EVP_DecryptFinal_ex:bad decrypt:/ ... /evp_enc.c:330:

但是对于一个密码,错误是不同的:

EVP_DecryptFinal_ex:bad decrypt:/ ... /evp_enc.c:337:

这两个错误有什么区别?

我在 OS X 上使用 OpenSSL 版本 098-59.60.1

【问题讨论】:

标签: c encryption openssl


【解决方案1】:

这很可能是两种不同的错误情况,都与填充有关:

n=ctx->final[b-1];
if (n == 0 || n > (int)b)
    {
    EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
    return(0);
    }
for (i=0; i<n; i++)
    {
    if (ctx->final[--b] != n)
        {
        EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
        return(0);
        }
    }

始终应用 OpenSSL 使用的 PKCS#7 填充。根据明文的大小,它将填充 1 到 16 个字节。 1 个字节的值为 0x01,两个字节的值为 0x02 等等,如果明文正好是块大小的 N 倍,则最多有 16 个字节(块大小)值 0x10

让我们看一下代码,其中b 是块大小(16),n 是最后一个字节的值。如果n 为零(无效值,见上文)或大于块大小b,您会看到它立即出错。只有在验证最后一个字节后,它才会检查块最后一部分中的其他n字节是否与最后一个字节n具有相同的值。

所以很遗憾你没有找到你的密码:只是在后面的代码中返回了使用错误密码后填充中的错误。

请注意,如果您尝试足够长的时间,您可能会创建一个解密的最后一个块,其中填充是正确的偶然。显然,这个机会略大于 1/256,因为这是生成最后一个字节值 0x01 的机会,这是可以生成的最小填充。在这种情况下,您可能需要查看解密的消息并检查内容是否正确。

【讨论】:

  • “所以很遗憾你没有找到你的密码:只是在代码前面返回了填充的错误......” - 填充预言机 FTW!
  • @jww 是的,话又说回来,即使没有它,CBC 上也有填充预言。只要他们不在 TLS 1.2 中使用此功能,那将是非常糟糕的。
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 2013-06-14
  • 2012-01-06
  • 1970-01-01
  • 2020-03-19
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多