2013-04-17 3 views
2

J'essaye d'implémenter l'algorithme RSA en C#. Le code ci-dessous fonctionne lorsque p et q sont petits, mais pas lorsque vous essayez de répliquer RSA-100 ou plus, où p et q sont très grands.RSA Implémentation en C#

Par exemple, lorsque:

p = 61, q = 53, n = 3233, phi(n) = 3120, e = 17, d = 2753 

Une fois déchiffré, je reçois le messsage d'origine correcte. J'ai ces valeurs du RSA Wikipedia page. Le code fonctionne également pour d'autres petites valeurs de p et q.

Toutefois, lorsque vous utilisez RSA-100 ou supérieur, je ne récupère pas mon message d'origine. J'ai essayé d'utiliser différentes valeurs pour l'exposant (e) et je me suis assuré qu'il est coprime avec phi (n) mais je ne peux pas obtenir le résultat correct. Ai-je manqué quelque chose de simple/évident?

Merci d'avance pour votre aide!

//p and q for RSA-100 
//string p = "37975227936943673922808872755445627854565536638199"; 
//string q = "40094690950920881030683735292761468389214899724061"; 

string p = "61"; 
string q = "53"; 

//Convert string to BigInteger 
BigInteger rsa_p = BigInteger.Parse(p); 
BigInteger rsa_q = BigInteger.Parse(q); 

//n = p * q 
BigInteger rsa_n = BigInteger.Multiply(rsa_p, rsa_q); 

//phi(n) = (p-1)*(q-1) 
BigInteger rsa_fn = BigInteger.Multiply((rsa_p - 1), (rsa_q - 1)); 

BigInteger rsa_e = 17; 

//Compute d 
BigInteger rsa_d = BigInteger.ModPow(rsa_e, (rsa_fn - 1), rsa_fn); 

//Encrypt the message, in this case 3007 
//C = (3007^rsa_e) mod rsa_n 
BigInteger C = BigInteger.ModPow(3007, rsa_e, rsa_n); 

//Decrypt the message, M should equal 3007 
//M = (3007^rsa_d) mod rsa_n 
BigInteger M = BigInteger.ModPow(C, rsa_d, rsa_n); 
+0

d = e^(phi-1) phi mod semble erroné me – CodesInChaos

+0

double possible de [Comment calculer D pour le cryptage RSA de P, Q et E ] (http://stackoverflow.com/questions/14229040/how-to-calculate-d-for-rsa-encryption-from-pq-and-e) – CodesInChaos

Répondre

3

d = e^(phi (n) -1) mod phi (n) me semble mal. Vous avez besoin de d = e^(phi (phi (n)) - 1) mod phi (n), ou vous pouvez utiliser euclid étendu.

+1

J'ai fini par implémenter l'algorithme euclidien étendu à partir du pseudo-code sur la page Wikipedia pour calculer d et cela a fonctionné correctement. Je vous remercie! –

1

Je vois que vous avez déjà accepté la solution. Cependant, je voudrais vous signaler l'article qui montre un exemple plus complexe sur le cryptage RSA en C#. Vérifiez ce poste (Il y a aussi le code source disponible): http://xmight.blogspot.com/2011/07/multithreaded-rsa-encryption-with-keys.html

+0

XMight === Andrei ??? Pour ma part, je suis très reconnaissant pour le/votre article, surtout après avoir lu sur RSA, je peux ensuite suivre un exemple de travail complet. Renfort très utile. – GPGVM

+0

Heureux d'entendre cela, c'était son but. Et oui, vous avez raison :) – XMight

+0

@XMight Votre lien vers le code source est cassé maintenant. S'il vous plaît, créez un nouveau lien. –