2012-12-04 14 views
-1

Qu'est-ce qu'une solution pour générer au hasard long long avec une force cryptographique С ++? (boost est autorisé)Générateur aléatoire long long C++

+2

Pourquoi ne pas Boostez ? -il nous aide à comprendre quelles sont vos limites – Mark

+0

@Mark j'ai besoin d'une solution sans boost car elle doit fonctionner sous linux sans bibliothèques boost pré-installées – Roman

+1

Sur linux vous pouvez lire 'sizeof (long long)' octets de '/ dev/aléatoire ». – zch

Répondre

6

L'en-tête <random> fournit un accès portable à des installations de nombres aléatoires, y compris, potentiellement, un pRNG cryptographique.

#include <random>  // random_device, uniform_int_distribution 
#include <algorithm> // generate_n 
#include <iterator> // ostream_iterator 
#include <iostream> // cout 
#include <functional> // bind, ref 

int main() { 
    std::random_device r; 
    std::uniform_int_distribution<long long> dist; 

    std::generate_n(std::ostream_iterator<long long>(std::cout, "\n"), 10, 
     std::bind(dist,std::ref(r))); 
} 

std::random_device ne peut pas être un PRNG cryptographique sur toutes les implémentations, de sorte que vous devrez vérifier la documentation de mise en œuvre. En particulier, VC++ avant 2012 ne fournit pas une implémentation non déterministe. VC++ 2012 et les versions ultérieures implémente cela en utilisant les services de cryptographie Windows.

Les implémentations sur d'autres systèmes d'exploitation tels que Linux ou Mac OS X peuvent couramment utiliser "/ dev/urandom" ou "/ dev/random" ou tout autre périphérique aléatoire exposé via le système de fichiers. Par exemple. libC++ utilise par défaut "/ dev/urandom", qui sous OS X utilise l'algorithme Yarrow.

Je sais que vous avez exclu l'amélioration, mais boost::random_device a une implémentation pour Windows qui utilise les services de cryptographie de cette plate-forme.

+1

+1 pour l'utilisation de std mais aussi pointant pour booster à nouveau (je ne comprends pas pourquoi les gens n'ont pas de configuration de boost par défaut) – gvd

+0

@gvd: De nombreuses entreprises font pas comme mettre du code source ouvert sur la machine de construction. –

3

Sous linux vous pouvez lire /dev/random ou /dev/urandom

Ils fournissent tous les deux l'entropie cryptographique.

différence entre eux étant: /dev/random blocs si l'entropie est épuisé, donc il pourrait être plus lent que /dev/urandom mais est « plus forte »

Ainsi, en utilisant des flux, il ressemblera à ceci

long long n; 
std::ifstream rstream ("/dev/random"); 
rstream >> n;