rsa
题目是rsa,首先了解一下什么是rsa加密,具体的看这个文章
首先大概介绍下RSA加密解密
RSA加密是对明文的E次方后除以N后求余数的过程
公钥n = p * q,其中p和q是两个大素数
e是随机选择的数,作为公钥
从通式可知,只要知道E和N任何人都可以进行RSA加密了
所以说E、N是RSA加密的密钥,也就是说E和N的组合就是公钥,
我们用(E,N)来表示公钥
密文进行D次方后除以N的余数就是明文,这就是RSA解密过程
知道D和N就能进行解密密文了,所以D和N的组合就是私钥
知道了RSA的原理后来看这道题
附件有两个,一个公钥,还有一个应该是密文
我们首先可以利用这个在线网站,分解公钥得到E和N
E=65537 (0x10001)
N=0xC0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD
N=p*q
我们可以利用这个工具网站直接分解N得到p和q(记得将N转换为10进制去分解)
p= 285960468890451637935629440372639283459
q=304008741604601924494328155975272418463
知道了p和q后我们根据L=lcm(p-1,q-1)
(L为p-1、q-1的最小公倍数)就可以算出L,有了L和E可以根据1 < D < L,E*D mod L = 1
算出D,有了D和N我们就可以根据明文=密文^D mod N
来解密出明文了
原理看懂了,上exp
import gmpy2
import rsa
e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
phin = (q-1)*(p-1)
d = gmpy2.invert(e, phin)
key = rsa.PrivateKey(n, e, int(d), p, q)
with open("G:\output\flag.txt", "rb+") as f:
f = f.read()
print(rsa.decrypt(f, key))
exp中用到了两个模块,rsa和gmpy2,没有安装的可以看我这篇文章