gpt4 book ai didi

c++ - AES CBC 解密有效,CTR 无效

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:55 26 4
gpt4 key购买 nike

我正在尝试使用 AES CBC 和 CTR 模式解密数据。密文前面已经加上了 16 字节的 IV。

我的密文数据格式如下:

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

我正在使用 Crypto++ 来解密数据。这是我的代码:

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

如您所见,中间 block (CTR 解密的第一个 block )产生垃圾输出。请注意,这个 block 实际上应该与用于 CBC 解密的 block 完全相同。

用于CBC解密的区 block 基本是从this FAQ entry复制过来的(回答于 2005 年 10 月 21 日上午 10:38 杰弗里)。然后,我更改了此 block 以将其用于 CTR 解密,这是它无法工作的时候。第二个 CTR block 的灵感来自“示例程序”部分 here .

第一个 CTR 代码块中似乎有什么问题?

最佳答案

可能是因为

AES::解密 aesDecryption(&(CTRKeys[i][0]), CTRKeys[i].size());

https://upload.wikimedia.org/wikipedia/commons/3/3c/CTR_decryption_2.svg

CTR Mode需要AES::Encryption来解密ciphertest

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

关于c++ - AES CBC 解密有效,CTR 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17546977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com