问题描述
我正在为我的 C++ 程序使用 Cryptopp 库来执行 encrypt 和 decrypt 操作。 AES 密钥和 Initialize Vector
长度是相同的 16
字节。在我的 code
中有 2 个 AES
模式(CBC 和 CTR):
// 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 (将#修改为@)