【问题标题】:AES, 128 and 256 Invalid Key LengthAES、128 和 256 无效密钥长度
【发布时间】:2015-04-03 03:30:37
【问题描述】:

我正在尝试使用 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 中提供的 example.zip 时会发生同样的事情(并将密钥长度更改为 256 或 128)

知道为什么会抛出 Exception 吗?

【问题讨论】:

  • “使用 Wiki 中提供的 example.zip 时也会发生同样的情况” - 我怀疑 wiki 是否提供了使用 128 字节密钥的示例。如果你能引用它,那么我可以修复它。

标签: c++ encryption aes crypto++ aes-gcm


【解决方案1】:

以这种方式初始化块大小和密钥会更好,更安全:

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

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

【讨论】:

    【解决方案2】:

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

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

    这应该与操作方式无关。

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2013-08-23
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 2011-10-01
      • 1970-01-01
      • 2017-11-21
      相关资源
      最近更新 更多