CTF_记录一次RSA攻击

RSA题的做法基本就是 搞清楚已知量未知量 分析可不可解

做了一道题
题目给了
n 二进制下1024位 格式为十六进制
e 65537
c 密文 二进制下1024位 格式为十六进制

显然n这么大不可能直接分解
我们需要
私钥d 然后套解密公式
m=c^d mod n

题目给了服务器并声明
input: d
output: e

输入小素数3,5,7
返回十进制的数大概200多位
输入65537:返回不告诉你
很显然只要输入一个d 返回65537就好了
就好了。。。
但这个d显然很大
枚举不可能

我们手头上 已知n e d
e?随便一个值比如3
d?服务器返回的值
e*d=1 (mod (p-1)(q-1))
百度攻击方式!
RSA攻击—-已知公钥n,e私钥d
原理没整明白
挺厉害的

def gcd(a,b):
    if b==0:
        return a
    else :
        return gcd(b,a%b)

def getpq(n,e,d):
    p = 1
    q = 1
    while p==1 and q==1:
        k = d * e - 1
        g = random.randint ( 0 , n )
        while p==1 and q==1 and k % 2 == 0:
            k /= 2
            y = pow(g,k,n)
            if y!=1 and gcd(y-1,n)>1:
                p = gcd(y-1,n)
                q = n/p
    return p,q

//结果可能为负
//最后print 可以 print x%s,y%s python取模的特性
def ext_gcd(a, b):
    if b == 0:
        return 1, 0
    else:
        k = a // b
        remainder = a % b       
        x1, y1 = ext_gcd(b, remainder)
        x, y = y1, x1 - k * y1          
    return x, y

已知p,q一切就简单了
用扩展欧几里得把d求出来
套一遍公式即可

c = (int)("0x004252980300",16) 16进制to 10

print pow(c,d,n) c^d%n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值