我一直试图解密几年前加密的文件。我不记得密码,所以我一直在查看我当时可能使用的潜在密码列表。其中一个密码产生的错误与我使用任何其他密码获得的错误不同。
我是否有可能找到正确的密码,但出现了其他问题?
这是我使用的命令:
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
答案 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
的最后一个字节的机会,这是可以生成的最小填充。在这种情况下,您可能必须查看解密的消息并检查内容是否正确。