ctf密码学方向入门笔记:RSA加密中利用试根法求d

本文仅作为个人入门ctf密码学方向的做题笔记,以养成写博客的习惯。

这周做了一些密码学方向的入门题目,初步了解了RSA的加密过程:

第一步,生成两个大素数p和q。

第二步,计算这两个素数的乘积n=pq。

第三步,计算小于n并且与n互素的整数的个数,即欧拉函数

\varphi(n)=(p-1)(q-1)

第四步,选取一个随机数e,且满足1<e<\varphi (n),并且e和\varphi (n)互素,即gcd(e,\varphi (n))=1

第五步,计算d=e^{-1}mod\varphi (n)

第六步,保密d、p和q,而公开n和e,即d作为私钥,而n和e作为公钥。

以上摘自《信息安全工程师教程》。

在密码学练习题中,往往需要找到私钥d,从而通过运算

ans=C^{d}\quad mod\quad n

解密得到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("未找到解,请重新设定解的取值范围")

代码中利用试根法求解方程

(k\varphi (x)+1)\quad mod\quad e=0, \quad k=1,2,...

由第五步d的表达式推得。

该算法的缺点在于不适合计算d的取值范围长度过大的情况。在该代码的情形下,取值范围长度超过1亿时代码运行时间达到了半分钟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值