En este post la solución a otro de los retos de criptografía sobre el criptosistema RSA que he puesto recientemente. Su enunciado decía lo siguiente:
"En el archivo asociado al reto (reto_29.txt) nos dan los valores decimales correspondientes a: p, q, dp y dq, ¿puedes descifrar el criptograma (c)?".
Solución: tras la pista dada en el post en el que enuncié este reto, para aquellos que sepan algo sobre RSA, descifrar el criptograma (c) es tan fácil como aplicar el teorema chino del resto.
Nos dan los dos factores primos (p y q) del módulo (n), dp y dq. Los dos últimos son el resultado del siguiente cálculo (en la práctica se calculan una única vez y así no deben obtenerse para cada descifrado):
Asimismo, también se precalcula (para no tener que obtenerlo cada vez que vamos a descifrar) el siguiente valor:
Y, a partir del critograma (c) que también se nos proporciona en el archivo asociado al reto, procedo al descifrado de la siguiente manera:
1.- Calculo cp = c mod p; cq = c mod q
2.- Calculo m1 = cpdp mod p; m2 = cqdq mod q
3.- El mensaje en claro (m) es: m1 + (((m2 - m1) (p-1 mod q))mod q) p
Dicho lo anterior, para obtener el mensaje en claro (m) creo el siguiente script en python:
import Crypto.Util.number
p = 106173580239682931389627142547722999257831171755485751420548914984291463023277
q = 97024725573258981352721169214486148772531836683230815123426383547032318244639
dp = 82768637783929703292736175179870424829982980072138899248910448548872405600793
dq = 46253925280152133213346163079911969514933734737540326180649259214793638996555
c = 5903986077375251213373364128743214754255438662482522592294836805989467960938886932522824278823967144102657348495540833028246856934662323247888340774059845
cp = c%p
cq = c%q
m1 = pow(cp,dp,p)
m2 = pow(cq,dq,q)
m = m1+(((m2-m1)*Crypto.Util.number.inverse(p,q))%q)*p
print''
print'*** Solucion'
print 'm (ascii) ...:', Crypto.Util.number.long_to_bytes(m)
Y tras ejecutar este script:
Ya puedo ver la solución al reto: Y4_3574_D35c1fl4d0_:).
******** PRÓXIMO RETO
Reto 30: "John the Ripper".
"En el archivo asociado al reto (reto_29.txt) nos dan los valores decimales correspondientes a: p, q, dp y dq, ¿puedes descifrar el criptograma (c)?".
Solución: tras la pista dada en el post en el que enuncié este reto, para aquellos que sepan algo sobre RSA, descifrar el criptograma (c) es tan fácil como aplicar el teorema chino del resto.
Nos dan los dos factores primos (p y q) del módulo (n), dp y dq. Los dos últimos son el resultado del siguiente cálculo (en la práctica se calculan una única vez y así no deben obtenerse para cada descifrado):
dp = d mod(p-1)
dq = d mod(q-1)
Asimismo, también se precalcula (para no tener que obtenerlo cada vez que vamos a descifrar) el siguiente valor:
p-1 mod q
1.- Calculo cp = c mod p; cq = c mod q
2.- Calculo m1 = cpdp mod p; m2 = cqdq mod q
3.- El mensaje en claro (m) es: m1 + (((m2 - m1) (p-1 mod q))mod q) p
Dicho lo anterior, para obtener el mensaje en claro (m) creo el siguiente script en python:
import Crypto.Util.number
p = 106173580239682931389627142547722999257831171755485751420548914984291463023277
q = 97024725573258981352721169214486148772531836683230815123426383547032318244639
dp = 82768637783929703292736175179870424829982980072138899248910448548872405600793
dq = 46253925280152133213346163079911969514933734737540326180649259214793638996555
c = 5903986077375251213373364128743214754255438662482522592294836805989467960938886932522824278823967144102657348495540833028246856934662323247888340774059845
cp = c%p
cq = c%q
m1 = pow(cp,dp,p)
m2 = pow(cq,dq,q)
m = m1+(((m2-m1)*Crypto.Util.number.inverse(p,q))%q)*p
print''
print'*** Solucion'
print 'm (ascii) ...:', Crypto.Util.number.long_to_bytes(m)
Y tras ejecutar este script:
******** PRÓXIMO RETO
Reto 30: "John the Ripper".
Comentarios
Publicar un comentario