2013-09-22 150 views
1

我有這樣的代碼,試圖解密:AES解密和「無效的PKCS#7塊填充」

byte key[AES::DEFAULT_KEYLENGTH]; 
string key_s = "essasenhaehfraca"; 

for (int i = 0; i < key_s.size(); i++) 
    key[i] = (byte) key_s[i]; 

string ciphertext = "A506A19333F306AC2C62CBE931963AE7DFCFFA940360A40FFD5DC69B9C2E53AD" 
string decryptedtext; 

try 
{ 
    ECB_Mode<AES>::Decryption decryptor; 
    decryptor.SetKey(key, sizeof(key)); 
    CryptoPP::StringSource(ciphertext, true, 
      new CryptoPP::StreamTransformationFilter(decryptor, 
       new CryptoPP::StringSink(decryptedtext) 
      ) 
    ); 

} 
catch(const CryptoPP::Exception& e) 
{ 
    cerr << e.what() << endl; 
    system("pause"); 
    exit(1); 
} 

return 0; 

當我執行它,我得到的異常 StreamTransformationFilter: invalid pkcs #7 block padding found。 我搜索了但沒有找到任何東西。有人知道我爲什麼得到這個錯誤?我在互聯網上找到的每個例子都是這樣,沒有一個人提到這個錯誤。

回答

8

它看起來像你的密文是十六進制編碼。你需要一個HexDecoder添加到您的解密流:

CryptoPP::StringSource ss(ciphertext, true, 
    new CryptoPP::HexDecoder(
     new CryptoPP::StreamTransformationFilter(decryptor, 
      new CryptoPP::StringSink(decryptedtext)))); 
+0

這可以解決問題。謝謝。 – user2748531

2

以我的經驗,我想那是因爲你沒有正確創建鍵:

byte* key_s = (byte*)"essasenhaehfraca"; 
SecByteBlock key(key_s, AES::DEFAULT_KEYLENGTH); 

而在這之後:

ECB_Mode<AES>::Decryption d; 
d.SetKey(key, key.size()); 
+0

在這裏說,沒有'執行SecByteBlock'接受'string'作爲第一個參數。 – user2748531

+0

@ user2748531,如果你用'byte'改變'string':'byte * key_s =「essasenhaehfraca」;'? –

+0

'錯誤C2440:初始化:不能從 '爲const char [17]' 轉換爲「字節*' – user2748531