【问题标题】:AES and key length errorAES 和密钥长度错误
【发布时间】:2012-11-11 21:34:30
【问题描述】:

我正在尝试使此代码正常工作。来自Cryptopp AES

演示在 CTR 中使用 AES 进行加密和解密

唯一的区别是,我创建了函数 encryptAESdecryptAES 并插入了代码。 它无需创建这些功能即可工作。但现在我收到以下错误:AES/CTR 4 is not a valid key length but the key is 16 bit long.

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

【问题讨论】:

  • 您的函数正在根据退化指针的大小计算密钥大小。 IE。 sizeof(key) != 密钥数组中字节的大小。这两个函数都需要一个 key_len 附加参数。

标签: c++ key aes crypto++


【解决方案1】:

您的函数采用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&lt;&gt;作为选项,或者传递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);

我希望这是有道理的,因为同样的错误出现在几个地方。

【讨论】:

  • 非常感谢。就是这样。你知道,我对 C++ 很陌生。 ;)
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2022-09-26
相关资源
最近更新 更多