San Vu Ngoc - IRMAR
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/K9OKdtJ_xHg?rel=0&&showinfo=0" frameborder="0" allowfullscreen></iframe>')
Comment construire une machine à crypter ?
Museo della Scienza e della Tecnologia "Leonardo da Vinci" [CC BY-SA 4.0 ]
Alan Turing 1912-1954
On va avoir besoin de l'algorithme d'Euclide étendu (Bézout)
def Bezout (a,b):
"cette fonction retourne (d,u,v) tel que au+bv=d"
uu, vv = 1, 0
u, v = 0, 1
rr, r = a, b # invariants de boucle: a*u + b*v = r et a*uu = b*vv = rr
while r != 0:
q = rr / r # on divise l'ancien reste "r(n-1)" (rr) par le reste "r(n)" (r)
print ("On a %d = %d*%d + %d," % (rr, q, r, rr % r ))
r, rr = rr % r, r
u, uu = uu - q*u, u # on calcule les nouveaux coefficients u,v
v, vv = vv - q*v, v
print (" donc %d*(%d) + %d*(%d) = %d." % (a, u, b, v, r))
return (rr,uu,vv)
p=11
q=23
n=p*q
n
phi=(p-1)*(q-1)
phi
Bezout(3,220)
Donc on a pgcd(3,220)=1 et $(-73)\times 3 + 1 \times 220 = 1$. Donc (-73) est un inverse de 3 modulo 220. D'autre part $-73\equiv 147$ modulo 220.
e=3
d=147
Alice peut diffuser sa clef publique à ses correspondants, ou même l'afficher sur sa page web ou son compte social. Alice doit aussi soigneusement détruire les traces de $p$, $q$ et $\varphi(n)$: autant limiter le nombre de secrets à garder; il suffit de garder $d$ secret.
Par exemple $m=123<253$, OK
m=123
$x = m^e$ modulo $n$. On utilise ici la fonction dédiée pow(m,e,n)
x = pow(m,e,n)
x
#vérifions
(m**e), (m**e) % n
On peut l'envoyer à Alice !
Elle a besoin de sa clef privée d=147. Elle doit calculer $x^d$ modulo 253
y = pow(x,d,n)
print ("Le message envoyé par Bob est:")
print (str(y))
print ('Trop bien ;)')
(Alice trouve que Bob n'est pas très loquace. Il fera mieux la prochaine fois)