C 是否仍然可以使用Na.h生成字符空间(32)到(126)?还是以其他方式生成安全字符串?

C 是否仍然可以使用Na.h生成字符空间(32)到(126)?还是以其他方式生成安全字符串?,c,random,passwords,libsodium,C,Random,Passwords,Libsodium,我正在创建一个C程序来生成密码 C中的rand()即使使用srand((unsigned int)**main+(unsigned int)和argc+(unsigned int)time(NULL))也会生成一些相同的字符串集,但比使用srand(time(NULL))更好。 我发现了这一点,我终于知道如何将libnail链接到我的项目 之后,我意识到我只能为randombytes\u uniform()设置上限,下限总是0 并使用randombytes\u random()为我提供密码中无法

我正在创建一个C程序来生成密码

C中的
rand()
即使使用
srand((unsigned int)**main+(unsigned int)和argc+(unsigned int)time(NULL))
也会生成一些相同的字符串集,但比使用
srand(time(NULL))更好。

我发现了这一点,我终于知道如何将libnail链接到我的项目

之后,我意识到我只能为
randombytes\u uniform()
设置上限,下限总是
0

并使用
randombytes\u random()
为我提供密码中无法使用的所有类型的字符

有人知道如何使用钠或任何安全的方式生成字符空间(32)到字符(126)吗

以下是原始代码:

#include <stdio.h>
#include <stdlib.h>
#include "sodium.h"
#pragma warning (disable:4996)

void main(int argc, char **argv){

    /* Length of the password */
    int length, num, temp, number;
    num = 10;
    length = 10;
    number = num;

    clear_screen();

    /* Seed number for rand() */
    srand((unsigned int)**generate_standard_password + (unsigned int)&argc + (unsigned int)time(0));

    while (num--)
    {
        temp = length;
        printf("\n\t%2d. ", (number - num));
        while (temp--) {
            putchar(rand() % 56 + 65);
            srand(rand());
        }
        temp = length;
    }
    printf("\n\n\t");
    system_pause();
}
#包括
#包括
#包括“钠h”
#杂注警告(禁用:4996)
void main(整型argc,字符**argv){
/*密码的长度*/
int长度、num、temp、number;
num=10;
长度=10;
number=num;
清除屏幕();
/*兰德()的种子编号*/
srand((unsigned int)**生成标准密码+(unsigned int)和argc+(unsigned int)时间(0);
while(num--)
{
温度=长度;
printf(“\n\t%2d.”,(number-num));
while(临时--){
putchar(rand()%56+65);
srand(rand());
}
温度=长度;
}
printf(“\n\n\t”);
系统暂停();
}

有126-32+1=95个字符供您选择。因此,将
rand
的结果修改为95,然后添加32。这会给你一个你想要的范围内的数字

您一直获得相同字符集的原因是您在每次通话后都要重新播种。你应该在启动时只播一次种子

while (temp--) {
    putchar((rand() % 95) + 32);
}

如果
h
未除以
max(r)+1,则不要使用
r mod h
,否则输出将偏向较低的值

rand()
函数返回一个介于
0
rand\u MAX
之间的值,通常为
2^31
。因此,
rand()%95
的输出比其他值更可能是
0
1
2

这就是libnaude中的
randombytes\u uniform()
函数的全部要点:为任意范围提供无偏输出

randombytes\u uniform(95)
返回一个介于
0
94
之间的值。如果这是您想要的,只需添加
32
32+randombytes\u uniform(95)