Encryption 我可以在AES加密计数器模式下指定nonce和计数器吗?

Encryption 我可以在AES加密计数器模式下指定nonce和计数器吗?,encryption,aes,crypto++,Encryption,Aes,Crypto++,我正在尝试使用库Crypto++进行基于AES计数器模式的加密/解密 我想将IV值拆分为nonce和counter。 有没有直接使用nonce和counter来构造IV的API 为了实现它,我做了以下几点 byte counter[AES::BLOCKSIZE/2] = {0x0}; // initialized to zero : 64 bit counter string counterstr ; byte nonce[AES::BLOCKSIZE/2];

我正在尝试使用库Crypto++进行基于AES计数器模式的加密/解密

我想将IV值拆分为nonce和counter。
有没有直接使用nonce和counter来构造IV的API

为了实现它,我做了以下几点

byte counter[AES::BLOCKSIZE/2] = {0x0};     // initialized to zero : 64 bit counter
string counterstr ;
byte nonce[AES::BLOCKSIZE/2];                // 64 bit nonce 
string noncestr ;
prng.GenerateBlock(nonce, sizeof(nonce));
StringSource(nonce, sizeof(nonce), true,
    new HexEncoder(
    new StringSink(noncestr)
    ) // HexEncoder
    );
StringSource(counter, sizeof(counter), true,
    new HexEncoder(
    new StringSink(counterstr)
    ) // HexEncoder
    );
SecByteBlock no = HexDecodeString(noncestr);
SecByteBlock ctr = HexDecodeString(counterstr);
string ivv = noncestr + counterstr;
SecByteBlock ivvb = HexDecodeString(ivv);
然后我用

e.SetKeyWithIV(key, sizeof(key), iv);
问题:
  • 这是实现这一目标的唯一方法还是有其他更简单的方法

  • 对块进行加密或解密时,计数器值是否自动递增

  • 这个很简单,我应该为每个块指定另一个nonce值吗

这是实现这一目标的唯一方法还是有其他更简单的方法

否。增量函数在完整的128位块上运行。请参见Crypto++wiki上的

如果您提供自己的递增计数器功能,则较长的答案是Yes。如果将高阶位用于nonce,将低阶位用于计数器,则较长的答案可以是Yes(见下文)


对块进行加密或解密时,计数器值是否自动递增


这个很简单,我应该为每个块指定另一个nonce值吗

不,计数器是递增的


有没有直接使用nonce和counter来构造IV的API

不。从更实际的角度讲,在密钥/非密钥对(或安全上下文)下可以加密的纯文本数量是有限制的。我认为它远低于2GB。如果我的记忆是正确的,那么在计数器进入高64位之前,您必须很长时间重新设置关键帧

实际上,这意味着您可以使用高64位作为随机nonce,而使用低64位作为计数器。因此,您的代码看起来像:

byte counter[AES::BLOCKSIZE] = {0};
prng.GenerateBlock(counter, 8);
执行上述代码后,高64位将是随机的,低64位将从0开始并用作计数器

由于2 GB是限制,您可以使用12-4拆分而不是8-8拆分:

byte counter[AES::BLOCKSIZE] = {0};
prng.GenerateBlock(counter, 12);
执行上述代码后,高96位将是随机的,低32位将从0开始并用作计数器



相关的,永远不要重复使用nonce。每个消息都必须有自己独特的安全上下文。这通常意味着一个唯一的nonce(另一个选项是为每条消息提供一个唯一的密钥)。否则,您可以使用一个
XOR

计数器值*块大小=2^64*16字节
来恢复密钥。对于一个nonce密钥对,数据量将远远超过2GB。使用64位计数器有点浪费。当使用32位计数器时,可以在相同的nonce密钥对下安全加密64 GiB。这也会使随机生成nonce对nonce重用更具弹性,因为它现在是96位宽。您是如何计算2GB值的?@Artjom-我没有计算2GB值。我是凭记忆工作的,这可能是错的。的第3节提供了基于风险承受能力的限额。