2010-10-30 30 views
1

J'essaie d'implémenter le RSA algorithm, mais pour une raison quelconque, mon code ci-dessous ne produit pas de résultats corrects (notez que seul le code pertinent est affiché).Petit problème dans l'implémentation de l'algorithme RSA

BigInteger n = p.multiply(q); 
BigInteger totient = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE)); 

Random rand = new Random(); 
BigInteger e; 
do 
{ 
e = new BigInteger(totient.bitLength(), rand); 
} while ((e.compareTo(BigInteger.ONE) <= 0 || e.compareTo(totient) >= 0) 
    && !((e.gcd(totient)).equals(BigInteger.ONE))); 

BigInteger d = (BigInteger.ONE.divide(e)).mod(totient); 

sortie de l'échantillon en utilisant 127 et 131 comme les entrées de nombres premiers (notez que 16637 est correct, mais 7683 et 0 ne sont pas):

Public Key: (16637,7683) 
Private Key: (16637,0) 

Merci pour toute aide!

+0

Montrez-nous un peu de sortie – Woot4Moo

+0

Sortie d'échantillon ajoutée. –

+0

Je ne sais pas avec certitude, mais il y a 99% de chances que BigInteger d = (BigInteger.ONE.divide (e)). Mod (totient); est de donner zéro à la suite de cette division() – Jonathan

Répondre

0

Les commentaires sont corrects. Vous devez utiliser la méthode modInverse() de BigInteger pour calculer un inverse. Donc, la dernière ligne devrait être:

BigInteger d = e.modInverse(totient); 

Aussi, je ne suis pas tout à fait certain que je comprends la condition dans la boucle while. Peut-être que le dernier && devrait être un ||? Personnellement, j'utiliserais une méthode séparée qui renvoie un nombre aléatoire dans la plage correcte.