Я создаю C-программу для генерации паролей.

rand() в C продолжает генерировать один и тот же набор строк, даже используя srand((unsigned int)**main + (unsigned int)&argc + (unsigned int)time(NULL)), найденный в здесь, но лучше, чем при использовании srand(time(NULL))

Я нашел этот ответ, и я наконец-то знаю, как связать libsodium с моим проектом.

После этого я понимаю, что могу установить только верхнюю границу для randombytes_uniform(), нижняя граница всегда 0.

И использование randombytes_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();
}
-1
wei 28 Май 2017 в 03:55

2 ответа

Лучший ответ

Вы можете выбрать из 126 - 32 + 1 = 95 символов. Поэтому измените результат rand на 95, а затем добавьте 32. Это даст вам число в нужном диапазоне.

Причина, по которой вы продолжаете получать один и тот же набор символов, заключается в том, что вы пересыпаете после каждого вызова. Вы должны только заполнить один раз при запуске,

while (temp--) {
    putchar((rand() % 95) + 32);
}
1
dbush 28 Май 2017 в 01:11

Не используйте r mod h, если h не делит max(r) + 1, иначе выходные данные будут смещены в сторону более низких значений.

Функция rand() возвращает значение между 0 и RAND_MAX, обычно это 2^31. Таким образом, выходные данные rand() % 95, скорее всего, будут 0, 1 или 2, чем другие значения.

В этом весь смысл функции randombytes_uniform() в libsodium: обеспечить беспристрастный вывод для произвольных диапазонов.

randombytes_uniform(95) возвращает значение между 0 и 94 (включительно). Просто добавьте 32, если это то, что вы хотите: 32 + randombytes_uniform(95).

1
Frank Denis 28 Май 2017 в 12:45