Openssl文件解密错误解密不好。 Openssl的密钥或不兼容版本错误?

时间:2017-05-11 20:11:14

标签: c encryption openssl

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

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

这是我使用的命令:

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

1 个答案:

答案 0 :(得分:2)

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

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的最后一个字节的机会,这是可以生成的最小填充。在这种情况下,您可能必须查看解密的消息并检查内容是否正确。