生成nonce c ++

Sky*_*eSM 2 c++ openssl cryptography crypto++ nonce

我想知道是否有办法使用OpenSSL或Crypto ++库生成Cryptographic Nonce.还有什么比使用autoseeded池生成一组随机字节更多的东西吗?

jww*_*jww 6

我想知道是否有办法使用OpenSSL或Crypto ++库生成加密nonce.

加密++:

SecByteBlock nonce(16);
AutoSeededRandomPool prng;

prng.GenerateBlock(nonce, nonce.size());
Run Code Online (Sandbox Code Playgroud)

OpenSSL:

unsigned char nonce[16];
int rc = RAND_bytes(nonce, sizeof(nonce));
unsigned long err = ERR_get_error();

if(rc != 1) {
    /* RAND_bytes failed */
    /* `err` is valid    */
}

/* OK to proceed */
Run Code Online (Sandbox Code Playgroud)

还有什么比使用autoseeded池生成一组随机字节更多的东西吗?

nonce基本上是IV.它通常被认为是一个公共参数,如IV或Salt.

nonce在安全上下文中必须是唯一的.您可能还需要一个nonce不可预测.

唯一性和不可预测性是两个不同的属性.例如,从开始的计数器0000000000000000是唯一的,但它也是可预测的.

当您需要唯一性和不可预测性时,可以将随机数分区为随机值和计数器.随机值将占用16字节随机数的8个字节; 而计数器将占用16字节随机数的剩余8个字节.然后使用递增函数基本上i++每次需要一个值时执行.

你不需要8-8分裂.12-4工作,4-12工作.这取决于应用程序和重新加密前所需的随机数.重新加密通常由纯文本字节计数驱动.

16-0也有效.在这种情况下,您使用随机值,避开计数器,并避免增量函数.(增量函数基本上是级联添加).

NIST SP800-38CSP800-38D提供了几种创建nonce的方法,因为CCM和GCM使用它们.

另请参阅nonce的要求是什么?在加密堆栈交换.