2017-05-11 85 views
0

我一直試圖解密一個我幾年前加密的文件。我不記得密碼,所以我一直在瀏覽我可能使用過的密碼列表。其中一個密碼產生的錯誤與我使用任何其他密碼得到的錯誤不同。Openssl文件解密錯誤解密錯誤。錯誤的密鑰或不兼容的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

另請參閱[Apple OpenSource | OpenSSL的](https://opensource.apple.com/tarballs/OpenSSL/)。 – jww

回答

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); 
     } 
    } 

PKCS#7填充,如由OpenSSL使用,始終應用。它將填充1到16個字節,取決於明文的大小。如果明文正好是塊大小的N倍,則值爲1字節的0x01,兩個字節值爲0x02等,最多爲16字節(塊大小),值爲0x10

所以讓我們來看看代碼,其中b是塊大小(16),而n是最後一個字節的值。如果n爲零(無效值,請參見上文),或者它大於塊大小b,則會發現它立即錯誤輸出。只有在驗證最後一個字節後,它纔會檢查塊的最後部分中的其他n字節是否與最後一個字節n的值相同。

因此,很遺憾,您還沒有找到您的密碼:它只是在使用錯誤密碼後填充中的錯誤稍後會在代碼中返回。

請注意,如果您嘗試足夠長的時間,您可能會創建一個解密的最後一個塊,其中填充是正確的偶然。顯然這個機會略大於1/256,因爲這是生成最後一個字節值0x01的機會,這是可以生成的最小填充。在這種情況下,您可能需要查看解密後的消息並檢查內容是否正確。

+0

哇,這是一個快速首先upvote :) –

+0

*「因此,不幸的是你還沒有找到你的密碼:它只是填充的錯誤返回在代碼中的更早....」 - 填充ORACLE FTW! – jww

+0

@jww是的,然後,再一次,即使沒有它,CBC上也有填充的神諭。只要他們不在TLS 1.2中使用這個函數,那將會非常糟糕。 –