2013-09-22 147 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