si vous savez déjà que e * d doit être congru à 1 mod phi (n)
puisque vous connaissez phi (n) un tuple (e, d) peut être calculé en utilisant l'algorithme d'Euclide étendu (EEA):
choisir un entier pour e (généralement un petit entier, ce sera l'exposant public, le cryptage sera plus rapide avec des exposants plus petits) qui est inférieur à phi (n) et supérieur à 2 (? (je pense)
lorsque vous avez un candidat pour e, calculer le plus grand diviseur commun (gcd) de e et phi (n) ... devrait être 1 ... sinon, choisissez un nouveau candidat pour e et répétez (puisqu'il n'y aurait pas d'inverse modulaire, en d'autres termes, il n'y a pas d'exposant privé d pour cet e et phi (n))
après que vous savez que gcd (e, phi (n)) == 1 vous pouvez calculer d en utilisant l'EEE (ou en raccourci, calculer EEA directement car il fournira également le GCD ... si ce n'est pas 1, choisissez une nouvelle valeur pour e)
EEA (rapide et sale pour calculer l'inverse modulaire) :
imaginer une table avec 3 colonnes:
permet de dire que ces colonnes sont nommées: b, q et t
de sorte que les lignes de cette table ressemblera:
b0, q0, t0
b1, q1, t1 ...
(et ainsi de suite)
les 2 premières lignes seront initialement rempli. pour toutes les autres rangées, il existe une règle itterative qui peut être appliquée sur les deux dernières rangées qui se traduira par des valeurs pour la ligne suivante
les 2 premières lignes sont les suivantes:
phi (n), no_value, 0
e, le plancher (phi (n)/e), 1
la règle itterative pour créer la ligne suivante est la suivante: (où [] est un opérateur d'index pour sélectionner la rangée)
b [i ] = b [i-2] mod b [i-1]
q [i] = b [i-1]/b [i] (entier r division, no fractions ...)
t [i] = t [i-2] - (q [i-1] * t [i-1])
vous pouvez abandonner le schéma lorsque b [ i] devient 0 ou 1 ... vous n'avez pas vraiment besoin de q pour la dernière rangée ...
donc si b [i] est 0, b [i-1] ne peut pas être 1 puisque vous devriez avoir avorté lorsque vous avez calculé b [i-1] si c'était 1 ...
si vous atteignez b [i] == 0, b [i-1] est votre gcd ... puisque ce n'est pas 1 besoin d'une nouvelle valeur pour e
si b [i] == 1 votre gcd est 1, et il y a un inverse ...et qui est t [i] (si t est négatif, ajouter phi (n))
exemple avec des valeurs réelles:
disons phi (n) est de 120 disons que nous choisissons 23 en tant que candidat pour e
notre table ressemblera:
b q t
120 – 0
23 5 1
5 4 -5
3 1 21
2 1 -26
1 2 47
la dernière calculée b est 1 so => GCD (23120) == 1 (la preuve: l'inverse existe)
le dernier calculé t est 47 = > 23 * 47 mod 120 == 1 (t est l'inverse)
pastebin n'est pas utilisé sur Stackoverflow. Veuillez inclure votre code dans la question même et essayez de le limiter aux parties qui vous posent problème. – dandan78
Faites-vous cela pour votre propre amusement et éducation ou pour une application de production? Si c'est le dernier, utilisez une bibliothèque existante comme openssl. – JeremyP
Si vous voulez que le code soit utilisable pour les applications de sécurité, en plus du problème de génération de premier ordre, vous devez implémenter des opérations arithmétiques pour les très longs numéros. La longueur de clé plus ou moins sécurisée est de 2048 bits (peut encore être craquée si vous avez suffisamment de ressources). Donc votre clé de 32 bits (n = p * q) est juste ridicule. Si vous voulez juste jouer avec - c'est OK. –