2012-01-15 4 views
1

RSA Decryption ÉditionRSA Decryption Édition C#

Je rencontre des problèmes avec un programme C# RSA. Il ne décrypte pas correctement. Lorsque j'attribue d =(e^-1)%phiN, puis que j'applique d à mon texte chiffré, il me fournit des réponses décimales ridicules. Il devrait arriver avec un nombre entier. Je pense que c'est un problème avec mes maths. Avez-vous des conseils? Si vous avez besoin de plus de détails ou du reste du code, demandez. De plus, y a-t-il un système de remplissage que je pourrais utiliser pour améliorer ce code? À l'heure actuelle, ce code est vulnérable à l'analyse de fréquence.

protected void decryptRSA(object sender, EventArgs ev) 

{ 
     double p = (double)Convert.ToInt64(P.Text);//I use 123 for testing 
     double q = (double)Convert.ToInt64(Q.Text);//127 
     double e = (double)Convert.ToInt64(E.Text);//133 
     double phiN = (p-1)*(q-1); 
     double n = p*q; 
     double d = Math.Pow(e, -1D); 
     d = d%phiN; 

     string cipherStr = outputBuffer.Text; 
     double[] cipherTextDouble = new double[100]; 
     string[]plainText = new string[cipherTextDouble.Length]; 

     cipherTextDouble = parser(cipherStr, 'D'); 
    for(int slot = 0; slot<cipherTextDouble.Length; slot++) 
     { 
    cipherTextDouble[slot] = (double)(Math.Pow((double)cipherTextDouble[slot],(double)d)%n); 
     } 
     for(int slot = 0; slot<cipherTextDouble.Length; slot++) 
     { 
      inputBuffer.Text += Convert.ToChar(cipherTextDouble[slot]) + ' ';//the spot were it dies 
//it doesn't like to convert from a decimal like 1.75 to a char. Of course I should never get a decimal like 1.75, which is the problem 
     } 
    } 
+1

ne pas utiliser double. –

Répondre

2

Vous ne calculez pas correctement l'exposant. Vous devez trouver un numéro d tel que ed = 1 (mod phi), c'est-à-dire l'inverse de e (mod phi). Ce n'est pas la même chose que de calculer l'inverse de e dans les réels qui est ce que double d = Math.Pow(e, -1D); calcule, et ensuite faire l'opération mod. C'est la raison pour laquelle vous vous retrouvez avec un nombre décimal (dans ce cas 1/133 ~ 0.007 et 1/133% 15372 still = 0.007 puisque % est en fait un opérateur 'reste' en C# et non un module entier (sinon ne travaille pas sur un double de toute façon)).

Vous devez utiliser le Euclidean Algorithm pour calculer le mod phi inverse.

EDIT: GregS souligne correctement que pour une implémentation d'ordinateur, vous souhaitez probablement utiliser le Extended Euclidean Algorithm à la place pour trouver l'inverse modulaire en un seul passage. C'est ce qui est habituellement fait par calcul. Vous pouvez le faire avec l'algorithme euclidien (généralement à la main) mais c'est une perte de temps.

+1

L'algorithme euclidien * étendu *. –