我想让这段代码正常运行。它来自Cryptopp AES
使用点击率
中的AES演示加密和解密
唯一的区别是,我创建了函数 encryptAES 和 decryptAES 并插入了代码。 它可以在不创建这些功能的情但现在我收到以下错误: AES / CTR 4不是有效密钥长度,但密钥长度为16位。
string encryptAES(const byte key[], const string& plain, const byte iv[])
{
try
{
string cipher;
CTR_Mode< AES >::Encryption e;
e.SetKeyWithIV(key, sizeof(key), iv);
// The StreamTransformationFilter adds padding
// as required. ECB and CBC Mode must be padded
// to the block size of the cipher.
StringSource(plain, true,
new StreamTransformationFilter(e,
new StringSink(cipher)
) // StreamTransformationFilter
); // StringSource
return cipher;
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
return "";
}
}
string decryptAES(const byte key[], const string& cipher, const byte iv[])
{
try
{
string recovered;
CTR_Mode< AES >::Decryption d;
d.SetKeyWithIV(key, sizeof(key), iv);
// The StreamTransformationFilter removes
// padding as required.
StringSource s(cipher, true,
new StreamTransformationFilter(d,
new StringSink(recovered)
) // StreamTransformationFilter
); // StringSource
return recovered;
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
return "";
}
}
int main(int argc, char *argv[])
{
AutoSeededRandomPool prng;
byte key[AES::DEFAULT_KEYLENGTH];
prng.GenerateBlock(key, sizeof(key));
byte iv[AES::BLOCKSIZE];
prng.GenerateBlock(iv, sizeof(iv));
string plain = "CTR Mode Test";
string encoded, cipher, recovered;
/*********************************\
\*********************************/
// Pretty print key
encoded.clear();
StringSource(key, sizeof(key), true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "key: " << encoded << endl;
// Pretty print iv
encoded.clear();
StringSource(iv, sizeof(iv), true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "iv: " << encoded << endl;
/*********************************\
\*********************************/
cout << "plain text: " << plain << endl;
cipher = encryptAES(key, plain, iv);
/*********************************\
\*********************************/
// Pretty print
encoded.clear();
StringSource(cipher, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "cipher text: " << encoded << endl;
/*********************************\
\*********************************/
recovered = decryptAES(key, cipher, iv);
cout << "recovered text: " << recovered << endl;
cin.sync();
cin.get();
}
答案 0 :(得分:2)
您的函数正在使用const byte key[]
参数,该参数基本上被视为指针。因此sizeof(key)是平台上指针的大小。
string encryptAES(const byte key[], const string& plain, const byte iv[])
// sizeof(key) is the size of a pointer
e.SetKeyWithIV(key, sizeof(key), iv);
您可以使用std::vector<>
作为选项,或传递key_len,例如:
string encryptAES(const byte key[], size_t key_len, const string& plain, const byte iv[])
// using key_len for the length of the key
e.SetKeyWithIV(key, key_len, iv);
我希望这是有道理的,因为同样的错误在几个地方。