Rechercher : dans
Par :

[Python] Créer paire de clé Rsa

Dernière réponse le 21 déc 2006 à 12:26:19 kilian, le 2 avr 2005 à 15:07:19 
 Signaler ce message aux modérateurs

Bonjour,

J'aimerais reproduire l'algo décris ici:
http://sebsauvage.net/comprendre/encryptage/crypto_rsa.html (voir "créer une paire de clé")

Mais je fais face à un problème. Je me retrouve devant:
On choisit d tel que 71*d mod 1008 = 1

C'est l'exemple du lien , le soucis est que je dois trouver d en tant que nombre aléatoire. Le seul truc que j'ai trouvé c'est de doner une nouvelle valeur aléatoire à d jusqu'à ce qu'il vérifie la condition donnée au dessus.
Je crois que ça fonctionne chez moi mais ça donne un algo très très lent.

Je vous donne mon bout de code au cas où vous auriez une autre idée (j'ai laissé la correspondance des noms de variable entre l'algo et le code:

class keygen:
	def __init__(self,len_premiers,premiers):  # premiers est une liste de nombres premiers
		ref_p=random.choice(range(0,len_premiers))
		ref_q=random.choice(range(0,len_premiers))
		
		p=premiers[ref_p]
		q=premiers[ref_q]
		
		self.n=p*q
		
		
		test=(p-1)*(q-1)
		self.e=test  #Cette valeur permettra de lancer la boucle en dessous pour trouver la vraie valeur de e
		
		while (test%self.e==0):
			self.e=random.choice(range(0,test))
		
		self.d=0.3333   #Idem, cette valeur sert à lancer la boucle en dessous pour trouver d, c'est pas très élégant mais j'ai pas trouvé mieux
		
		while (self.d)==0.3333 or (self.e*self.d)%test!=1:
			self.d=random.choice(range(len(premiers),1000)) # Et voilà c'est ici que ça coince je crois, ça rend le code très lent


Si vous avez juste une astuce pour trouver d d'une façon plus rapide, faite m'en part.
Merci d'avance :-)
Configuration: Debian/Python 2.3

Meilleures réponses pour « [Python] Créer paire de clé Rsa » dans :
Windows 7 : Créer une clé USB d'installation Voir Cette astuce vous permettra de créer votre clé USB d'installation de Windows 7. Ce qui est très utile dans le cas des mini pc portables dépourvus de lecteur/graveur DVD, mais aussi pour toutes personnes préférant ce type de supports. (cela...
Dual boot Windows XP / Windows Vista VoirRemarque importante : L'utilitaire utilisé dans cette astuce (Vista Boot Pro) n'est plus gratuit. La solution alternative est expliquée dans cette astuce : Réaliser un multiboot Introduction Installer XP puis Vista Installer XP par...
Le chiffrement avec RSA Voirle système RSA Le premier algorithme de chiffrement à clé publique (chiffrement asymétrique) a été développé par R.Merckle et M.Hellman en 1977. Il fut vite rendu obsolète grâce aux travaux de Shamir, Zippel et Herlestman, de célèbres...
La sécurité des réseaux sans fils Wi-Fi (802.11 ou WiFi) VoirUne infrastructure adaptée La première chose à faire lors de la mise en place d'un réseau sans fil consiste à positionner intelligemment les points d'accès selon la zone que l'on souhaite couvrir. Il n'est toutefois pas rare que la zone...

1

kilian, le 2 avr 2005 à 15:49:28

Aaah ça y est j'ai trouvé.
Finalement, j'ai plutôt vérifié tous les nombres (dans une certaine portion d'entiers) qui vérifient:

self.e*x%test==1
où x sont les entiers à vérifier.
Puis j'ai posé une boucle au cas ou cette expression ne marcherais pas avec la valeur la valeur de e dans une certaine plage de x.

Ca donne:
class keygen:
	def __init__(self,len_premiers,premiers):
		ref_p=random.choice(range(0,len_premiers))
		ref_q=random.choice(range(0,len_premiers))
		
		p=premiers[ref_p]
		q=premiers[ref_q]
		
		self.n=p*q
		
		self.d=0
		while not self.d:
			test=(p-1)*(q-1)
			self.e=test
		
			while (test%self.e==0):
				self.e=random.choice(range(2,test))
		
		
			liste=range(len(premiers),len(premiers)+1000)
			liste_d=[]
		
			for nb in liste:
				if ((self.e*nb)%test==1):
					liste_d.append(nb)
		
			try:
				self.d=random.choice(liste_d)
			except:
				pass	


Bon ça génère bien trois nombres, maintenant à savoir si ça génère des clés rsa valides, rien n'est moins sûr :-)

Répondre à kilian

2

cryptoman, le 3 nov 2006 à 22:14:32

Il existe une librairie C qui convient parfaitement pour s'amuser avec RSA: gmp.h (http://www.swox.com/gmp/)

Elle permet notament de
- travailler avec des nombre de tres grande taille (512, 1024, 2048 bits...)
- trouver facilement des nombres premiers (p et q)
- generer des nombres aleatoires (e)
- faire une inversion avec modulo (d)
- calculer une puissance avec modulo (encryption/decryption RSA)

Avec cette librairie, la generation des cles devient simplissime...

Répondre à cryptoman

3

kilian, le 3 nov 2006 à 22:40:03

Même si ma question date d'il ya un an, je te remercie, car ma curiosité sur ce sujet est toujours d'actualité :-)

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

4

 pacificator, le 21 déc 2006 à 12:26:19

Il existe la lib pyCrypto et ezPyCrypto qui l'interface de maniere plus pythonique.

Répondre à pacificator
Collection CommentÇaMarche.net