python - encrypt - pycrypto windows
En el intercambio de claves Diffie-Hellman (3)
Olvidaste dos módulos más:
>>> 5556302616191343498765890791686005349041729624255239232159744 % 22
16L
>>> 793714773254144 % 22
16
El libro que estoy leyendo explica el algoritmo de la siguiente manera:
- 2 personas piensan en 2 números públicos de "nyg" de los que ambos son conscientes.
- 2 personas piensan en 2 números privados "x" e "y" que guardan en secreto.
El intercambio ocurre como se ilustra
Puse el siguiente código python para ver cómo funciona esto y ... no es así. Por favor, ayúdame a entender lo que me estoy perdiendo:
#!/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
Roman tiene razón. Sin embargo, será mejor que eche un vistazo a la función de tres argumentos de pow (). Mucho más rápido y tercer argumento es el 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)