AES、128 和 256 密钥长度无效

AES, 128 and 256 Invalid Key Length

本文关键字:密钥长度 无效 AES      更新时间:2023-10-16

我正在尝试使用Crypto++加密文本。上次使用 AES CTR 时效果很好,但现在使用 CBC 或 GCM 时,我可以使用的最大密钥长度是 32 位??

处理加密的代码:

string xAESPlain, xAESCipher;
AutoSeededRandomPool xRng;
byte xAESKey[128]; // Doesnt Work has to be 32 or 16
byte xAESIv[128];
xRng.GenerateBlock(xAESKey, sizeof(xAESKey));
xRng.GenerateBlock(xAESIv, sizeof(xAESIv));
CBC_Mode< AES >::Encryption E;
E.SetKeyWithIV(xAESKey, sizeof(xAESKey), xAESIv);
StringSource ss(xAESPlain, true,
    new StreamTransformationFilter(E,
        new StringSink(xAESCipher)
    )
);

当运行这个 Crypto++ 时,会抛出一个Exception

terminate called after throwing an instance of 'CryptoPP::InvalidKeyLength'
  what():  AES/CBC: 128 is not a valid key length

请注意,使用Wiki中提供的示例.zip也会发生同样的事情(并将密钥长度更改为256或128)

知道为什么要抛出Exception吗?

字节通常是八位字节(8 位)。AES 指定为 128 位块大小或 16 字节,这也是 IV 的大小。AES 密钥大小可能分别为 128 位、192 位或 256 位或 16 字节、24 字节或 32 字节。它们与那些没有什么不同。因此,将其用于AES-256:

byte xAESKey[32];
byte xAESIv[16];

这应该与操作模式无关。

这样初始化

块大小和键更好一点,更安全:

unsigned char iv[ CryptoPP::AES::BLOCKSIZE ];
unsigned char keyq[ CryptoPP::AES::MAX_KEYLENGTH ];

CryptoPP也有像CryptoPP::AES::MIN_KEYLENGTH等常量。