【问题标题】:Can I specify the nonce and counter in AES encryption counter mode?我可以在 AES 加密计数器模式下指定随机数和计数器吗?
【发布时间】:2015-06-17 09:47:37
【问题描述】:

我正在尝试使用库 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值吗?

【问题讨论】:

    标签: encryption aes crypto++


    【解决方案1】:

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

    没有。增量功能在完整的 128 位块上运行。请参阅 Crypto++ wiki 上的 CTR mode and Counter Increment

    更长的答案是“是”如果您提供自己的IncrementCounter 函数。较长的答案可以是“是”如果您将高位用于 nonce,将低位用于计数器(见下文)。


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

    是的。


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

    没有。计数器递增。


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

    没有。在更实际的情况下,在密钥/随机数对(或安全上下文)下可以加密多少纯文本是有限制的。我认为它远低于 2 GB。如果我的记忆是正确的,那么您必须在您的计数器进入高 64 位之前很久就重新输入密钥。

    实际上,这意味着您可以使用高 64 位作为随机数,使用低 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。每条消息都必须有自己独特的安全上下文。这通常意味着一个唯一的随机数(另一种选择是为每条消息提供一个唯一的密钥)。否则,您可以使用 XOR 轻松恢复密钥。

    【讨论】:

    • counter values * block size = 2^64 * 16 bytes 对于一对 nonce-key 来说将远超过 2GB 的数据。使用 64 位的计数器有点浪费。当使用 32 位计数器时,64 GiB 可以在相同的 nonce-key 对下安全加密。这也将使随机生成随机数对随机数重用更具弹性,因为它现在是 96 位宽。
    • 2GB的值是怎么计算出来的?
    • @Artjom - 我没有计算 2 GB 的值。我正在凭记忆工作,这可能是错误的。 Counter Mode Security: Analysis and Recommendations 的第 3 节提供了基于风险承受能力的限制。
    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 2012-09-27
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2017-09-17
    相关资源
    最近更新 更多