2017-05-28 2 views
-1

Je crée un programme C pour générer des mots de passe.Est-il possible de générer de l'espace de caractère (32) à ~ (126) en utilisant sodium.h? Ou d'une autre façon de générer une chaîne sécurisée?

rand() en C continuer à générer une même ensemble de chaînes même en utilisant srand((unsigned int)**main + (unsigned int)&argc + (unsigned int)time(NULL)) trouvés dans here mais mieux que d'utiliser srand(time(NULL))

J'ai trouvé ce answer, et je sais enfin comment lier libsodium à mon projet. Après cela, je me rends compte que je ne peux que fixer la limite supérieure pour randombytes_uniform(), la borne inférieure est toujours 0.

Et en utilisant randombytes_random() donnez-moi tous les types de caractères qui ne peuvent pas utiliser dans le mot de passe. Est-ce que quelqu'un peut savoir comment générer de l'espace de caractère (32) en caractère ~ (126) en utilisant du sodium ou tout moyen sécurisé de générer du caractère?

Voici le code original:

#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(); 
} 

Répondre

1

Il y a 126 - 32 + 1 = 95 caractères pour vous de choisir. Donc modifiez le résultat de rand par 95, puis ajoutez 32. Cela vous donnera un nombre dans la gamme que vous voulez. La raison pour laquelle vous continuez d'obtenir le même jeu de caractères est que vous réessayez après chaque appel. Vous ne devez semer une fois au démarrage,

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

Ne pas utiliser r mod h si h ne divise pas max(r) + 1, ou bien la sortie sera biaisé vers des valeurs plus basses.

La fonction rand() renvoie une valeur comprise entre 0 et RAND_MAX, généralement 2^31. Ainsi, la sortie de rand() % 95 est plus susceptible d'être 0, 1 ou 2 que d'autres valeurs.

Ceci est le point entier de la fonction randombytes_uniform() dans libsodium: pour fournir une sortie non biaisée pour des plages arbitraires.

randombytes_uniform(95) renvoie une valeur comprise entre 0 et 94 (inclus). Il suffit d'ajouter 32 si c'est ce que vous voulez: 32 + randombytes_uniform(95).