[羊城杯 2020]RRRRRRRSA 题解(wiener attack运用)

本文解析RSA加密中的Wiener Attack原理,挑战传统理解,通过实例展示如何在非典型条件下利用连分数求解关键参数。学习如何在N1/N2比例关系中应用Wiener Attack,而非标准指数d情况。

简介

自己写脚本搞定这道题有助于理解wiener attack,在多种关于RSA攻击方法中,这种方法算是比较难理解的一种,本题设计还是比较有意思的,算是该攻击方式的一个灵活运用,单纯依靠现成脚本也是不行的,必须学会wiener attack的原理才能顺利解决该问题。

原理阐述

wiener attack 是依靠连分数进行的攻击方式,适用于非常接近某一值(比如1)时,求一个比例关系,通过该比例关系再来反推关键信息就简单很多。这种攻击对于解密指数d很小时有很好的效果,一般的用法是通过
ed mod phi(N)=1

得到 ed=k*phi(N)+1

即 e/phi(N)=k/d+1/phi(N)
这种情况下phi(N)≈N,且phi(N)非常大
所以有 e/N - k/d = 1/phi(N),也就是说k/d与e/N非常接近,而e/N又是已知的
对e/N进行连分数展开,得到的一串分数的分母很有可能就是d(论文太难了,只能记结论了T_T),只要检验一下

ed mod phi(N)

看它是不是1就知道对不对了。

但是这道题倒是告诉我,wiener attack的利用并不一定是这样的方式,只要其他值符合类似的条件,也可以试着求出一个关键值。

另外注意:wiener attack使用是要满足一定数值条件的,对d和N的相对大小,以及p,q的相对大小都是有要求的,用之前可以先大概计算一下是否合适。(LaTaX公式编辑器不会用呀。。就不想把具体公式再打上来了)

题解

分析

先看看题干,明显可以发现加密指数e非常大,有经验就晓得这和wiener attack脱不了干系。
代码的逻辑也很好理解,先是把flag分成两部分(其实两部分加密方式是一样的),然后生成两个非常接近的大素数P1,P2,然后生成了两个相邻的较小的大素数,用P1的平方和Q1相乘得到N1,N2同理。用两个相近巨大的加密指数E加密。

import hashlib
import sympy
from Crypto.Util.number import *

flag = 'GWHT{************}'

flag1 = flag[:19].encode()
flag2 = flag[19:].encode()
assert(len(flag) == 38)

P1 = getPrime(1038)
P2 = sympy.nextprime(P1)
assert(P2 - P1 < 1000)

Q1 = getPrime(512)
Q2 = sympy.nextprime(Q1)

N1 = P1 * P1 * Q1
N2 = P2 * P2 * Q2

E1 = getPrime(1024)
E2 = sympy.nextprime(E1)

m1 = bytes_to_long(flag1)
m2 = bytes_to_
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值