1.RSA:
import gmpy2
from Crypto.Util.number import long_to_bytes
n=703739435902178622788120837062252491867056043804038443493374414926110815100242619
p=782758164865345954251810941
q=810971978554706690040814093
r=1108609086364627583447802163
e=59159
c=449590107303744450592771521828486744432324538211104865947743276969382998354463377
n=p*q*r
phi=(p-1)*(q-1)*(r-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))
由题目可以知道,这是简单的求m,先将n分解成成两个质数,但是发现分解为三个质数,改变一下脚本,加入元素r,即可
2.RSA算法的密钥生成过程如下:
- 随机生成两个大素数p和q。
- 计算n = p * q。
- 计算欧拉函数φ(n) = (p - 1) * (q - 1)。
- 选择一个整数e,满足1 < e < φ(n)且e与φ(n)互质(即最大公约数为1)。
- 计算d,满足d * e ≡ 1 (mod φ(n)),即d是e关于φ(n)的模反元素。
- 公钥为(n, e),私钥为(n, d)。
加密过程如下:
- 使用公钥(n, e)对明文m进行加密,得到密文c = me mod n。
解密过程如下:
- 使用私钥(n, d)对密文c进行解密,得到明文m = cd mod n。
由于e和d是互逆的,所以如果知道了n和e,就可以通过扩展欧几里得算法计算出d,从而得到私钥。但是,这个计算过程是单向的,即从公钥直接求出d是不可能的,除非使用暴力破解的方法,即尝试所有可能的d值,直到找到满足条件的那个d。这种方法在n足够大时是不可行的,因为计算量非常大。
因此,已知公钥求私钥是不可行的,除非你知道p和q,否则你无法从公钥计算出私钥。
3.代码分析:
- 导入库
import gmpy2
: 导入gmpy2
库,这是一个用于大整数运算和高精度计算的Python库。from Crypto.Util.number import long_to_bytes
: 从Crypto.Util.number
模块中导入long_to_bytes
函数,该函数用于将长整数转换为字节串。
- 变量定义
n
,p
,q
,r
,e
,c
: 这些变量分别代表RSA加密中的模数、三个素数、公钥指数和密文。
- 计算n
n = p * q * r
: 这里重新定义了n
,使其为三个素数的乘积。在标准的RSA中,n
通常是两个大素数的乘积。
- 计算欧拉函数phi
phi = (p-1) * (q-1) * (r-1)
: 欧拉函数用于计算与n
互质的正整数的个数。在多素数RSA中,这是正确的计算方法。
- 计算私钥d
d = gmpy2.invert(e, phi)
: 使用gmpy2
库的invert
函数来计算e
对phi
的模逆元,即私钥d
。在RSA中,这是通过满足e * d % phi == 1
来确保的。
- 解密
m = pow(c, d, n)
: 使用模幂运算进行解密。将密文c
的d
次方对n
取模,得到原始明文m
。
- 转换并打印明文
print(long_to_bytes(m))
: 将解密后的长整数m
转换为字节串,并打印出来。如果m
是一个可打印的字符串或文本,这将显示其内容。
作用:
- 该脚本的主要作用是解密一个基于RSA(但使用三个素数)加密的密文
c
,并输出解密后的明文。
4.RSA2
知道了公钥和密文,即n,e,c
大概是求明文或者d,m
先进行质数分解,网站,factordb.com
得到p,q,接下来可以求d,
在Linux里面中弄,
先下载rsatool,后下载gmpy2
安装gmpy2,需要的依赖库 gmp mpfr mpc
gmp 库安装
apt-get install libgmp-dev
mpfr 库安装
apt-get install libmpfr-dev
mpc 库安装
apt-get install libmpc-dev
pip安装
apt-get install python3-pip
gmpy安装
将密文复制到kali,文件名为enc,用openssl解base64
openssl enc -base64 -d -in enc.b64 -out flag.enc
-base64:利用base64编码或解码
-d :解码(decode),默认为编码(encode)
- in enc.b64 :这里代表经base64编码密文
- out flag.enc :输出为flag.enc
openssl rsautl -decrypt -in flag.enc -inkey pen.pem -out flag.txt
这个命令使用 openssl
的 rsautl
子命令来解密一个使用 RSA 私钥加密的文件。
-decrypt :进行解密
- in flag.enc :引入密文
-inkey open.pem :私钥
-out flag.txt :输出文件尾flag.txt
得到flag
5.签到题
一搜,发现是unicode转换ascll
字符解码
发现是一个base64
最后得到flag