2013-07-09 42 views
2

我想解密使用AES CBC和CTR模式的數據。密文已經預先加上了16字節的IV。AES CBC解密工作,點擊率不

我有我的密文數據的格式如下:

vector<vector<byte>> CBCMessages; 
vector<vector<byte>> CBCKeys; 
vector<vector<byte>> CTRMessages; 
vector<vector<byte>> CTRKeys; 

我使用加密+對數據進行解密。這是我的代碼:

for (int i = 0; i < CBCMessages.size(); i++) 
{ 
    std::string decryptedtext; 

    // split IV from ciphertext 
    byte iv[16]; 
    std::copy(CBCMessages[i].begin(), CBCMessages[i].begin()+16, iv); 
    CBCMessages[i].erase(CBCMessages[i].begin(), CBCMessages[i].begin()+16); 

    // this block works fine 
    AES::Decryption aesDecryption(&(CBCKeys[i][0]), CBCKeys[i].size()); 
    CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv); 
    StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext)); 
    stfDecryptor.Put(reinterpret_cast<const unsigned char*>(&(CBCMessages[i][0])), CBCMessages[i].size()); 
    stfDecryptor.MessageEnd(); 

    std::cout << decryptedtext << std::endl; 
} 

for (int i = 0; i < CTRMessages.size(); i++) 
{ 
    std::string decryptedtext; 

    // split IV from ciphertext 
    byte iv[16]; 
    std::copy(CTRMessages[i].begin(), CTRMessages[i].begin()+16, iv); 
    CTRMessages[i].erase(CTRMessages[i].begin(), CTRMessages[i].begin()+16); 

    // this block produces junk 
    AES::Decryption aesDecryption(&(CTRKeys[i][0]), CTRKeys[i].size()); 
    CTR_Mode_ExternalCipher::Decryption ctrDecryption(aesDecryption, iv); 
    StreamTransformationFilter stfDecryptor(ctrDecryption, new CryptoPP::StringSink(decryptedtext)); 
    stfDecryptor.Put(reinterpret_cast<const unsigned char*>(&(CTRMessages[i][0])), CTRMessages[i].size()); 
    stfDecryptor.MessageEnd(); 

    std::cout << decryptedtext << std::endl; 

    // try again with different method - this works fine 
    decryptedtext.clear(); 
    CTR_Mode<AES>::Decryption d; 
    d.SetKeyWithIV(&(CTRKeys[i][0]), CTRKeys[i].size(), iv, 16); 
    StringSource(reinterpret_cast<const unsigned char*>(&(CTRMessages[i][0])), CTRMessages[i].size(), true, 
     new StreamTransformationFilter(d, 
      new StringSink(decryptedtext) 
     ) 
    ); 

    std::cout << decryptedtext << std::endl; 
} 

如您所見,中間塊(CTR解密的第一個塊)會產生垃圾輸出。請注意,該塊實際上應與用於CBC解密的塊完全相同。

用於CBC解密的塊基本上是從this FAQ entry複製的(2005年10月21日10:38上午回答jeffrey)。然後,我修改了這個塊,將它用於CTR解密,這是它無法工作的時候。第二個CTR區塊受「示例程序」部分here的啓發。

在第一個CTR代碼塊中似乎有什麼問題?

+0

Coursera加密類,哈? – c00000fd

回答