2010-09-18 11 views
6

Je les valeurs p, q, n et e et souhaitez calculer la clé privée d. Comment puis-je faire cela, quelqu'un pourrait-il me donner l'exemple de code C#? J'utilise une classe BigInteger pour représenter les valeurs pour p, q, n et e, donc je suppose que d sera également BigInteger.génération de clé privée RSA en C#

Répondre

1

Le chemin court est de calculer l'inverse de e modulo (p-1) * (q-1). En fait, vous avez seulement besoin du moins commun multiple de p-1 et q-1, mais cela ne vous achètera pas beaucoup (oui, il y a plusieurs valeurs possibles pour d, c'est normal, ils sont tous équivalents) .

Si votre classe BigInteger a une méthode inverse modulaire, alors ce sera facile: il suffit de l'appeler. Sinon, vous devrez le calculer vous-même, en utilisant l'algorithme Euclidien étendu (c'est ce que les classes BigInteger ont tendance à utiliser pour calculer les inverses modulaires).

3

De Wikipedia:

Déterminer d (en utilisant une arithmétique modulaire) qui satisfait à la relation de congruence alt text

  • Autrement dit, ed - 1 peut être également divisée par le indicatrice (p - 1) (q - 1).
  • Ceci est souvent calculé en utilisant l'algorithme Euclidien étendu. D est conservé en tant qu'exposant de clé privée.

L'algorithme d'Euclide étendu permet de trouver des nombres entiers tels que ce qui suit est:

alt text

L'algorithme d'Euclide étendu est particulièrement utile lorsque a et b sont coprime , puisque x est l'inverse multiplicatif modulaire d'un modulo b.

Dans cette formule définie a-e, b-(p-1)(q-1) et gcd(a, b)-1 (parce que e et φ (pq) doivent être dans l'algorithme premiers entre eux RSA) et à résoudre pour x qui vous donne votre d. La page Wikipedia sur extended Euclidean algorithm a plus de détails sur la façon d'écrire l'algorithme à résoudre pour x et y. Par exemple, vous pouvez utiliser cette fonction récursive (en pseudo-code):

function extended_gcd(a, b) 
    if a mod b = 0 
     return {0, 1} 
    else 
     {x, y} := extended_gcd(b, a mod b) 
     return {y, x-(y*(a div b))} 

Dans .NET si vous voulez juste pour générer des clés RSA que vous n'avez pas à mettre en œuvre l'algorithme RSA-vous. Il existe déjà une implémentation de RSA dans le framework .NET que vous pouvez utiliser.

+0

Je sais comment générer des clés à partir de zéro, mais par curiosité j'essaie de récupérer d des valeurs ci-dessus. – b3n

1

Voilà comment je l'ai fait.

nombres premiers p = 7 et q = 17

Calculer n = p * q = 119

Calculer f (n) = (p-1) * (q-1) = 96

Calculer d = e^-1 mod f (n), par exemple, D = 77

Questions connexes