用随机数填充长整数数组

时间:2014-04-13 18:50:34

标签: c arrays random long-integer gnupg

我正在尝试使用“gcry_randomize”填充数组,其中每个条目都是四个字节。

我认为因为long用4个字节表示而我只需要正数,所以我使用带有64个条目的无符号长指针数组。然后我使用gcry_randomize函数用四个字节填充每个条目并尝试将其打印出来。有关printf函数的编译器错误,但它正在运行。

    unsigned long int* random_numbers[64];

    for(index = 0; index < 64; index++){
    gcry_randomize( random_numbers[index], 4, GCRY_STRONG_RANDOM);
        printf("Random number: %lu \n", random_numbers[index]);
}

然而,结果并不是真正随机的,并且不是我预期的大小(4个字节而不是1个字节):

Random Number 0: 32535136 
Random Number 1: 32535168 
Random Number 2: 32535200 
Random Number 3: 32535232 
Random Number 4: 32535264  

我应该将指针更改为unsigned char指针,然后将其转换为长整数吗?我的代码的下一步将是以模数计算该数字,因此需要一个长整数。 另一种选择是创建一个256字节的随机字符串,然后将字符串拆分为4个字节的部分,将其转换为long并保存。我用这种方法遇到的问题是我不知道如何读取char字符串的特定部分。

1 个答案:

答案 0 :(得分:0)

gcry_randomize使用随机字节填充缓冲区。所以,你可能得到的是4或8个随机字节,具体取决于你的架构。

你可以这样做

unsigned long int random_numbers[64];

for(index = 0; index < 64; index++) {
    gcry_randomize(&random_numbers[index], sizeof(random_numbers[index]), GCRY_STRONG_RANDOM);
    printf("Random number: %lu \n", random_numbers[index]);
}

您之前所做的是将未初始化的指针传递给gcry_randomize,这会导致未定义的行为。

更新

无需动态分配内存。如果你想先将随机字节放在一个单独的数组中,你可以在堆栈上使用一个字节数组

unsigned char buf[4];
gcry_randomize(buf, sizeof(buf), GCRY_STRONG_RANDOM);