Forum de mathématiques - Bibm@th.net
Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
- Accueil
- » Programmation
- » [Python] fabrication de clefs rsa
- » Répondre
Répondre
Résumé de la discussion (messages les plus récents en premier)
- Golgup
- 30-06-2009 08:51:30
Re,
J'en profite pour dire à Fred que son applet http://www.bibmath.net/crypto/moderne/rsa.php3 donne des exposants de dechiffrement negatif! Le probleme serait vite réglé en conditionnant sa négativité et en y remediant: d=d-(p-1)(q-1)*-1
bye
- Golgup
- 29-06-2009 10:06:23
Aller, je vous embête une derniere fois et vous propose ce code de generation de clefs rsa pour les interessés!
:
- from math import log
- from random import*
- def teun(s,f=0,t1=[]):
- while s!=f:
- s-=f
- c=int(log(s)/log(2))
- f=2**c
- t1.append(c)
- return t1
- a=2
- def tdeux(p,a,u=0,z=a,j=a,t2=[a]):
- while u!=t1[0]:
- z=j**2%p
- j=z
- u+=1
- t2.append(z)
- return t2
- def tetrois(t3=[],o=-1):
- while o<len(t1)-1:
- o+=1
- t3.append(t2[t1[o]])
- return t3
- print" *Generateur de clefs RSA*"
- print""
- print""
- b=input('Entrez a taille de la clef en bits:')
- print"------------------------------------------------------------------------"
- print""
- p=1
- while p<2**int((b+1)/2):
- p=randrange(2**int((b-1)/2),2**int((b+1)/2))
- if p%2==0:
- p=p+1
- s=p-1
- t1=teun(s,f=0,t1=[])
- t2=tdeux(p,a,u=0,z=a,j=a,t2=[a])
- t3=tetrois(t3=[],o=-1)
- m=reduce(lambda x, y: x *y, t3)%p
- if m==1:
- break
- q=1
- while q<2**int((b+1)/2):
- q=randrange(2**int((b-1)/2),2**int((b+1)/2))
- if q%2==0:
- q=q+1
- s=q-1
- teun(s,f=0,t1=[])
- t1=teun(s,f=0,t1=[])
- tdeux(q,a,u=0,z=a,j=a,t2=[a])
- t2=tdeux(q,a,u=0,z=a,j=a,t2=[a])
- tetrois(t3=[],o=-1)
- t3=tetrois(t3=[],o=-1)
- m=reduce(lambda x, y: x *y, t3)%q
- if m==1:
- break
- n=p*q
- e=2**16+1
- phi=(p-1)*(q-1)
- def pgcd(a,b):
- try:
- while b!=0:
- a=a%b
- b=b%a
- return a
- except:
- return b
- def t1_t2(a,b):
- try:
- while b!=0:
- a=a%b
- t1.append(a)
- t2.append(b/a)
- b=b%a
- t1.append(b)
- t2.append(a/b)
- return t2
- except:
- return t2
- def xk(l=1,xk=[1,0,1]):
- while l!=len(t1)-2:
- l+=1
- xk.append(t2[l-1]*xk[len(xk)-1]+xk[len(xk)-2])
- return xk
- while pgcd(e,phi)!=1:
- e+=2
- if pgcd(e,phi)==1:
- t1,t2=[e,phi],[e/phi]
- t2=t1_t2(e,phi)
- xk=xk(l=1,xk=[1,0,1])
- d=((-1)**(len(t1)-2))*xk[len(xk)-2]
- if d<0:
- d=d-phi*-1
- p='?'
- q='?'
- phi='?'
- print" Clef publique:"
- print""
- print 'n','=',n
- print 'e','=',e
- print""
- print"------------------------------------------------------------------------"
- print""
- print" Clef privée:"
- print""
- print 'd','=',d
- print""
- print"------------------------------------------------------------------------"
Si vous voulez connaître les 2 composants de n ainsi que phi(n) ou encore vérifier que ed=1 mod phi, supprimez juste ces lignes
:
- p='?'
- q='?'
- phi='?'
@+++