6
votes

Java.secure.random est-il un choix suffisant pour l'industrie du jeu?

Java fournit un générateur de nombres aléatoires sécurisés cryptographiquement dans l'emballage Java.Secure.random.

est-il possible d'utiliser ce générateur de numéros si je considère comme des éléments comme l'ensemencement et la ré-instanciation cyclique du RNG? Ou puis-je utiliser le générateur de nombres 'tel qu'il est'?

a-t-il d'expérience avec ce générateur?

edit : les exigences sont les suivantes:

a) être statistiquement indépendant

b) être assez distribué (dans les limites statistiquement attendues) sur leur gamme

c) passer divers tests statistiques reconnus

d) être cryptographiquement fort.


1 commentaires

Explorer ce problème plus loin, je viens de remarquer que le générateur de Secureandom de dernière station était SHA1. Il est possible qu'ils font autre chose que l'évidence; Sinon SHA1 a un état interne de 160 bits, ce qui ne suffit pas pour mélanger un seul jeu de cartes. Cela signifierait que peu importe ce que vous avez fait à votre RNG ou votre algorithme de shuffle, il serait toujours limité à ne produire qu'un sous-ensemble de permutations possibles. Strictement cela n'apparaît pas comme l'une de vos exigences; Alors peut-être que c'est bon.


3 Réponses :


1
votes

Vous pouvez utiliser java.security.securerandom comme vous pouvez utiliser java.util.random pour de telles choses.

Sachez que java.security.securerandom peut dépendre de l'entropie de l'ordinateur exécutant le programme. Si vous arrivez à de nombreuses valeurs aléatoires à partir de là, il peut bloquer jusqu'à ce que l'ordinateur soit généré par l'ordinateur (par exemple sur Linux Java.Security.securerandom utilise / dev / urandom ).

Donc, si vous voulez générer de nombreuses valeurs aléatoires et que vous pouvez avoir une vie avec une utilisation PRNG java.util.random . .


1 commentaires

Merci pour votre réponse. Je viens de mettre à jour la question avec les exigences. Malheureusement, un PRNG n'est pas suffisant.



3
votes

Documentation sur SECURAINDOM dit qu'il peut Le bloc attendant que le système génère plus d'entropie (par exemple, sous Linux, il prend des nombres aléatoires de / dev / aléatoires), de sorte que si vous allez l'utiliser, vous aurez peut-être besoin de l'aide du matériel: installez une carte génératrice de numéro aléatoire ( Un périphérique matériel qui génère des nombres aléatoires réels, non pseudo-aléatoires) de cette manière que votre système générera des nombres aléatoires avec suffisamment de vitesse afin que votre programme ne soit pas bloqué.


1 commentaires

+1 Il existe différentes stratégies SecureDandom que vous pouvez choisir, d'autres, utilisez la graine et certaines ne le font pas.



3
votes

Comme d'autres disent, le RNG sécurisé peut avoir un débit limité. Pour atténuer cela vous pouvez soit étirer ce hasard sécurisé en semant un CPRNG, ou vous pouvez Essayez d'optimiser votre utilisation du bitstream.

Pour mélanger un paquet de cartes, par exemple, vous n'avez besoin que de 226 bits, mais un naïf algorithme (appelant Nextint (n) pour chaque carte) utilisera probablement 1600 ou 3200 Bits, gaspillant 85% de votre entropie et vous rend sept fois plus susceptible à retarder.

Pour cette situation, je pense que le docteur Jacques la méthode serait appropriée.

aller avec cela, voici une analyse de performance contre progressivement plus Sources d'entropie coûteuses (contient également du code):

Recyclage du bit pour la mise à l'échelle des générateurs de nombres aléatoires

je me pencherais vers une utilisation efficace plutôt que d'étirer, car je pense que ça serait beaucoup plus facile de prouver l'équité d'un consommateur efficace d'un flux d'entropie digne de confiance que de prouver l'équité de toute méthode de dessin avec un PRNG bien ensemencé.


edit 2 : Je ne connais pas vraiment Java, mais je mets ceci ensemble: xxx

Ceci éloigne l'uniforme gourmand par défaut [0, N-1] générateur et le remplace avec un Médecin modifié Version Jacques. TIMING Une gamme de valeurs de carte-shuffle montre presque une vitesse 6x sur le SECURURANANDOM.NEXTINTINT (N) .

Ma version précédente de ce code (seulement 2x Speed-up ) supposé que SECURUERANDOM.NEXT (B) était efficace, mais il s'avère que l'appel a rejeté l'entropie et faisant glisser la boucle entière vers le bas. Cette version gère son propre chunking.