我想解密使用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代碼塊中似乎有什麼問題?
Coursera加密類,哈? – c00000fd