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

时间:2015-06-17 09:47:38

标签: encryption aes crypto++

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

我想将IV值拆分为nonce和counter 是否有任何API直接使用nonce和counter来构造IV?

我做了以下工作来实现它

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值吗?

1 个答案:

答案 0 :(得分:0)

  

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

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

答案较长的是 如果 您提供了自己的IncrementCounter功能。较长的答案可以是是 ,如果 ,您使用nonce的高位位和计数器的低位位(请参阅下文)。

  

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

  

这个是微不足道的,我应该为每个块指定另一个nonce值吗?

没有。计数器递增。

  

是否有任何API直接使用nonce和counter来构造IV?

没有。在更实际的术语中,在密钥/随机数对(或安全上下文)下可以加密多少纯文本是有限的。我认为它远低于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轻松恢复密钥。