如何解决AES 方法的 CTR 模式无法正确解密
我正在为我的 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 举报,一经查实,本站将立刻删除。