要学的东西有点太多,学得又慢,一直看不懂LLL的格要怎么构造,我要吐了。
参考:https://altman.vip/2019/03/25/%E5%9F%BA%E4%BA%8E%E5%A4%9A%E9%A1%B9%E5%BC%8F%E7%9A%84RSA%E4%BD%93%E5%88%B6%E6%8E%A8%E5%AF%BC/
https://github.com/p4-team/ctf/tree/master/2019-03-23-0ctf-quals/crypto_babyrsa
这是去年的一道多项式环的题目,对于当时的我肯定是看半天文章也不知道该怎么求解,现在也还差不多。。。
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from pubkey import P, n, efrom secret import flagfrom os import urandomR.<a> = GF(2 ^2049 ) def encrypt (m) : global n assert len(m) <= 256 m_int = Integer(m.encode('hex' ), 16 ) m_poly = P(R.fetch_int(m_int)) c_poly = pow(m_poly, e, n) c_int = R(c_poly).integer_representation() c = format(c_int, '0256x' ).decode('hex' ) return c if __name__ == '__main__' : ptext = flag + os.urandom(256 -len(flag)) ctext = encrypt(ptext) with open('flag.enc' , 'wb' ) as f: f.write(ctext)
当时做题也只是分解了n,但是直接减1得不到明文,不知道这个欧拉函数要怎么算
而这个题关键在于求不可约多项式的欧拉函数
回到欧拉函数定义本身,欧拉函数 是小于或等于n 的正整数中与n 互质 的数的数目。
再看不可约多项式p(x),除了0,长度为n每一个多项式都与p(x)互素,因此,
同时也可参考:
Polynomial based RSA: http://www.diva-portal.se/smash/get/diva2:823505/FULLTEXT01.pdf
而除了欧拉函数外,其它都和正常的RSA计算过程一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def decrypt (m, d) : m_int = Integer(m.encode('hex' ), 16 ) m_poly = P(R.fetch_int(m_int)) c_poly = pow(m_poly, d, n) c_int = R(c_poly).integer_representation() c = format(c_int, '0256x' ).decode('hex' ) return c if __name__ == '__main__' : p,q = n.factor() p,q = p[0 ],q[0 ] s = (2 ^p.degree()-1 )*(2 ^q.degree()-1 ) d = inverse_mod(e,s) with open('flag.enc' , 'rb' ) as f: ctext = f.read() print(decrypt(ctext,d))