我正在尝试使用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值吗?
答案 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
轻松恢复密钥。