En el intercambio de claves Diffie-Hellman

El libro que estoy leyendo, explica el algoritmo de la siguiente manera:

  • 2 personas piensan en 2 números públicos “n y g” que ambos conocen.
  • 2 personas piensan en 2 números privados de “x” y “y” que mantienen en secreto.

El intercambio sucede como se ilustra

introduzca la descripción de la imagen aquí

Reuní el siguiente código de Python para ver cómo funciona esto y … no funciona. Por favor, ayúdame a entender lo que me falta:

#!/usr/bin/python n=22 # publicly known g=42 # publicly known x=13 # only Alice knows this y=53 # only Bob knows this aliceSends = (g**x)%n bobComputes = aliceSends**y bobSends = (g**y)%n aliceComputes = bobSends**x print "Alice sends ", aliceSends print "Bob computes ", bobComputes print "Bob sends ", bobSends print "Alice computes ", aliceComputes print "In theory both should have ", (g**(x*y))%n --- Alice sends 14 Bob computes 5556302616191343498765890791686005349041729624255239232159744 Bob sends 14 Alice computes 793714773254144 In theory both should have 16 

Olvidaste dos modulos más:

 >>> 5556302616191343498765890791686005349041729624255239232159744 % 22 16L >>> 793714773254144 % 22 16 

Romano tiene razón. Sin embargo, es mejor que eches un vistazo a la función pow () de tres argumentos. Mucho más rápido y tercer argumento es módulo

Para dos personas

 #!/usr/bin/python p=141301# publicly known g=5728435 # publicly known x=76435 # only Alice knows this y=37846 # only Bob knows this aliceSends = (g**x)%p aliceComputes = (bobSends**x)%p bobSends = (g**y)%p bobComputes = (aliceSends**y) %p bobSends = (g**y)%p bobComputes = (aliceSends**y) %p print ("Alice sends ", aliceSends ) print ("Bob computes ", bobComputes ) print ("Bob sends ", bobSends) print ("Alice computes ", aliceComputes) 

Para tres o más personas.

 #!/usr/bin/python p=141301# publicly known g=5728435 # publicly known x=76435 # only Alice knows this y=37846 # only Bob knows this z=23# only carol knows this aliceSends = (g**x)%p bobSends = (aliceSends**y)%p carolComputes=(bobSends**z)%p bobSends2=(g**y)%p carolSends=(bobSends2**z)%p aliceComputes=(carolSends**x)%p carolSends2=(g**z)%p aliceSends2=(carolSends2**x)%p bobComputes=(aliceSends2**y)%p print ("Alice computes ga and sends it to Bob.",aliceSends) print ("Bob computes (ga)b = gab and sends it to Carol.",bobSends) print ("Carol computes (gab)c = gabc and uses it as her secret.",carolComputes) print ("Bob computes gb and sends it to Carol.",bobSends2) print ("Carol computes (gb)c = gbc and sends it to Alice.",carolSends) print ("Alice computes (gbc)a = gbca = gabc and uses it as her secret.",aliceComputes) print ("Carol computes gc and sends it to Alice.",carolSends2) print ("Alice computes (gc)a = gca and sends it to Bob.",aliceSends2) print ("Bob computes (gca)b = gcab = gabc and uses it as his secret.",bobComputes)