gpt4 book ai didi

c++ - 通过 rand 创建随机整数

转载 作者:行者123 更新时间:2023-11-28 02:56:08 25 4
gpt4 key购买 nike

我想编写一个密码学应用程序,需要一个函数来创建一个 iv。要创建 iv 我想使用 rand() (即使那不安全,我还是想稍后重写大部分代码)。这引出了我的问题:rand() 只返回从 0 到 RAND_MAX 的值(在我的机器上 RAND_MAX 是 32767),我不知道如果 RAND_MAX >= 65535 我是否可以使用这样的代码:

void generate_iv(unsigned char* char_buf, int len){
union { //treat char_buf like a short_buf
unsigned char* char_buf;
unsigned short* short_buf;
}
int i;
for (i = 0; i < len / 2; i++){ //fill short_buf with random values
short_buf[i] = (unsigned short) rand();
}
if (len & 0x01){ //could not fill char_buf with 2-byte short values completely
char_buf[len - 1] = (unsigned char) rand();
}
}

当然,这在每台机器上都可以轻松编译,但它不会在 RAND_MAX < 65535 的机器上运行,因为那样函数就不会填充所有位。

始终有效的代码是:

void generate_iv(unsigned char* char_buf, int len){
int i;
for (i = 0; i < len; i++){
char_buf = (unsigned char) rand();
}
}

这段代码应该没有问题,但它不像上面的代码那样有效。我的问题是:在这种情况下,效率和可移植性之间是否存在最佳选择?是否有更安全的方法(可能易于实现)来生成随机数或获取具有恒定大小的随机数的方法?

最佳答案

如您所说,rand()不安全,因此无论该问题如何,我都会提及手头的问题。

鉴于rand()生成一个 15 位的数字,而你想要一个 16 位的数字,你可以简单地做:

int a = rand();
int b = rand()&1;
return a | (b<<15);

或者一般来说,鉴于RAND_MAX < 0xFFFFRAND_MAX+1是 2 的幂:

int len = BIT_LEN(RAND_MAX);
int mask = (1<<(16-len))-1;
int a = rand();
int b = rand()&mask;
return a | (b<<len);

顺便说一句,不要忘记在程序开始时使用一些随机输入为 RNG 播种,例如:

srand((unsigned int)time(NULL));

关于c++ - 通过 rand 创建随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21946806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com