In this problem, an encrypted data is given with an public key.
Using RSA python module, we can find information about RSA algorithms.
(or use command: openssl rsa -pubin -in id-rsa.pub -text)
The exponent number used is 3, which is very small. And increasing the risk of rsa. Observing that the encrypt message is related small too, this give us a clue to solve rsa.
According to RSA encrypt schema, the formula below
It can reduce to
With e=3, we can get following formula
Since we have value of M and N, while C is plain text we need to solve, only K is unknown. With small small M and e, we can consider N is related small.So we wrote a program which use brute force to find K. To check if the 3-rd root of C-KN is an integer, we can find the true K and the key.
from Crypto.PublicKey import RSA from Crypto.Util import asn1 from base64 import b64decode import libnum import math import gmpy pubkey = open('id-rsa.pub').read() key = RSA.importKey(pubkey) print "n = " print key.publickey().n print "e = " print key.publickey().e nkey = key.publickey().n message = open("enc.dat",'r').read() print libnum.s2n(message[:-1]) ct = libnum.s2n(message.rstrip()) print libnum.len_in_bits(ct) c = ct k = 1 while True: if k % 10000 == 0 : print k p = gmpy.root(c, 3)[0] if pow(p,3,nkey)==ct: print libnum.n2s(p) break c += nkey k+=1
沒有留言:
張貼留言