繁体   English   中英

通过rand创建随机int

[英]creating random int by rand

我想写一个加密应用程序,需要一个函数来创建一个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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM