AES 方法的 CTR 模式无法正确解密

问题描述

我正在为我的 C++ 程序使用 Cryptopp 库来执行 encryptdecrypt 操作。 AES 密钥和 Initialize Vector 长度是相同的 16 字节。在我的 code 中有 2 个 AES 模式(CBCCTR):

// CBC Mode (encryption)
std::string aesCbcEncryption(LPCSTR szKey,LPCSTR szIV,LPCSTR szPlain)
{
    std::string strCipher;
    AESEncryption aese((CryptoPP::byte*)szKey,AES::KEYLENGTH_MULTIPLE * 2);
    CBC_Mode_ExternalCipher::Encryption encryptor(aese,(CryptoPP::byte*)szIV);
    StringSource ss((CryptoPP::byte*)szPlain,strlen(szPlain),true,new StreamTransformationFilter(encryptor,new StringSink(strCipher)));
    
    return strCipher;
}

// CBC Mode (decryption)
std::string aesCbcDecryption(LPCSTR szKey,LPCSTR szEncryptedText,size_t nEncryptedSize)
{
    std::string strPlain;
    AESDecryption aesd((CryptoPP::byte*)szKey,AES::KEYLENGTH_MULTIPLE * 2);
    CBC_Mode_ExternalCipher::Decryption decryptor(aesd,(CryptoPP::byte*)szIV);
    StringSource ss((CryptoPP::byte*)szEncryptedText,nEncryptedSize,new StreamTransformationFilter(decryptor,new StringSink(strPlain)));

    return strPlain;
}

我实现了 CTR 模式,就像 CBC 模式一样,但不同的是使用CTR_Mode_ExternalCipher 在每个函数中插入了 CBC_Mode_ExternalCipher 结构。

这是我测试它们的 code 的一部分:

string strKey = "1234567891234567";
string strIV = "abcdefghijklmnop";

// CBC Test
string strEncrypted = aesCbcEncryption(strKey.c_str(),strIV.c_str(),"hello");
string strDecrypted = aesCbcDecryption(strKey.c_str(),strEncrypted.c_str(),strEncrypted.size());
MessageBoxA(NULL,"Encrypted",MB_OK);
MessageBoxA(NULL,strDecrypted.c_str(),"Decrypted",MB_OK);

// CTR Test
string strEncrypted = aesCtrEncryption(strKey.c_str(),"hello");
string strDecrypted = aesCtrDecryption(strKey.c_str(),MB_OK);

如你所见,结果是这样的:

CBC

 Encrypted : òr“…ŸsI¾t¶I¼H‚
 Decrypted : hello`

点击率

Encrypted : Ì%Hú
Decrypted : â>|S

我不知道为什么 CTR 模式不能正确解密为纯文本?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)