11
votes

Générer des nombres premiers vraiment gros

Je joue et j'essaie d'écrire une mise en œuvre de RSA. Le problème est que je suis bloqué sur la génération des nombres premiers massifs impliqués dans la génération d'une paire de clés. Quelqu'un pourrait-il me signaler à un moyen rapide de générer d'énormes nombres premiers / probables?


0 commentaires

5 Réponses :


3
votes

Jetez un coup d'œil à la façon dont Truecrypt le fait-il. Aussi, jetez un coup d'œil à RABIN-MILLER pour tester de gros pseudoprimes.


1 commentaires

Pourquoi supposez-vous que Truecrypt génère des nombres premiers? Pour autant que je sache, il n'utilise que Crypto symétrique.



2
votes

Vous n'avez pas mentionné quelle langue vous utilisez. Certains ont une méthode pour faire cela intégré. Par exemple, en Java, cela est aussi simple que d'appeler NextProbablePRime () sur un BigInteger.


1 commentaires

Selon la manière dont cette fonctionnalité est mise en œuvre, vous pouvez compromettre votre choix clé si l'espace de recherche est réduit.



1
votes

Mono a une classe de Biginteger qui est open source, tout comme Java. Vous pourriez jeter un coup d'œil à ceux-ci. Ils sont probablement portables :) g'luck


0 commentaires

18
votes

Vous ne générez pas de nombres premiers exactement. Vous générez un grand nombre impair au hasard, puis testez si ce nombre est prime, sinon générer un autre au hasard. Il existe des lois de nombres premiers qui indiquent essentiellement que vos chances de "frapper" une prime via des essais aléatoires sont (2 / ln n)

par exemple, si vous souhaitez un numéro de qualité aléatoire de 512 bits, vous en trouverez un en 2 / (512 * ln (2)) Donc, environ 1 sur 177 des nombres que vous essayez sera d'amorcer.

Il existe de multiples façons de tester si un numéro est préféré, un bon est le "Miller-Rabin Test" Comme indiqué dans une autre réponse à cette question .

En outre, OpenSSL a un bel utilitaire à tester pour les nombres premiers: xxx


3 commentaires

Merci. Cela explique beaucoup de problèmes que j'avais eu.


Vous pouvez également générer des nombres premiers dans OpenSSL: OpenSSL Prime -Generate -Bits -Bits 512


Le plus grand 512 bits Prime est 2 ** 512-569 , trouvé à l'aide de: Python -C 'Imprimer ("\ n" .join ([STR (2 ** 512- (x * 2 +1)) pour x dans la plage (1000)])) '| xargs -n 1 openssl Prime



3
votes

Il existe un algorithme due à l'U. Maurer qui génère des preuves aléatoires (contrairement à des nombres premiers statistiquement probables) qui sont presque uniformément répartis sur l'ensemble de tous les nombres premiers d'une taille spéciale. J'ai une implémentation de python qui est assez efficace à: http://s13.zetaboards.com/crypto/topic/7234475/1/


0 commentaires