本文仅作为个人入门ctf密码学方向的做题笔记,以养成写博客的习惯。
这周做了一些密码学方向的入门题目,初步了解了RSA的加密过程:
第一步,生成两个大素数p和q。
第二步,计算这两个素数的乘积n=pq。
第三步,计算小于n并且与n互素的整数的个数,即欧拉函数
第四步,选取一个随机数e,且满足,并且e和互素,即。
第五步,计算。
第六步,保密d、p和q,而公开n和e,即d作为私钥,而n和e作为公钥。
以上摘自《信息安全工程师教程》。
在密码学练习题中,往往需要找到私钥d,从而通过运算
解密得到flag。
最简单的情形就是通过试根法解出d,参考代码如下
from Crypto.Util.number import*
p=getPrime(128)
q=getPrime(128)
#初始化128位的大质数
e=65537
fai=(p-1)*(q-1)
suc=False
dl=1
dr=100000
#设定d的取值范围
while suc==False:
for k in range(dl,dr+1):
if (k*fai+1)%e==0:
suc=True
d= (k*fai+1)//e
if suc:
print(f"找到d的解:")
print(d)
else:
print("未找到解,请重新设定解的取值范围")
代码中利用试根法求解方程
由第五步d的表达式推得。
该算法的缺点在于不适合计算d的取值范围长度过大的情况。在该代码的情形下,取值范围长度超过1亿时代码运行时间达到了半分钟。