RSA总结
RSA总结
基本原理:
- 选择两个大素数p、q,计算出模数N=p*q
- 计算欧拉函数φ = (p-1) * (q-1),随机选择一个e(1<e<φ),满足e和φ互质
- 取e的模反数d,计算方法为:e * d ≡ 1 (mod φ),e一般取65537
- 对明文m进行加密:c = pow(m, e, N),可以得到密文c (m<n)
- 对密文c进行解密:m = pow(c, d, N),可以得到明文m
整理:
- p 和 q:两个大的质数,是另一个参数
N
的的两个因子。 - N:大整数,可以称之为
模数
- e 和 d:互为无反数的两个指数
- c 和 m:密文和明文
- (N, e):公钥
- (N, d):私钥
- pow(x, y, z):效果等效
pow(x, y) % z
, 先计算x的y次方,如果存在另一个参数z
,需要再对结果进行取模。 - 密钥长度:n以二进制表示的的位数,例如密钥长度为512代表n用二进制表示的长度为512bit
- 一般商业化的密钥取4096位,迄今为止超级计算机破解的密钥位数为700多位
安全性分析
对于RSA加密算法,公钥(N, e)
为公钥,可以任意公开,破解RSA最直接(亦或是暴力)的方法就是分解整数N
,然后计算欧拉函数φ(n)=(p-1) * (q-1)
,再通过d * e ≡ 1 mod φ(N)
,即可计算出 d
,然后就可以使用私钥(N, d)
通过m = pow(c,d,N)
解密明文
保障RSA的安全性
1.定期更换密钥
2.不同的用户不可以使用相同的模数N
3.p与q的差值要大,最好是差几个比特
4.p-1与q-1都应该有大的素因子,一般建议选择的两个大素数p、q使得 p=2p+1和q=2q+1也是素数
5.e的选择不要太小
6.d的选择也是不可以太小,最好满足d>=n的4分之1
CTF常见攻击手法
暴力分解N的方法
[yafu]: https://blog.csdn.net/cliffordr/article/details/82747087 “window下安装yafu”
p,q相差不大或相差巨大时
[factordb]: http://www.factordb.com/index.php “在线分解网站”
n不超过1024位时
下面不再分析n能被上述方法分解的情况
对于N由多于两个的素数相乘的情况,N 的欧拉函数的数值由多个素数的欧拉函数相乘
1.对RSA的公共模数攻击(BUU-RSA3)
适用于:使用相同的模数 N 、不同的私钥,加密同一明文消息
已知c1,c2,e1,e2,n1=n2
1 | c1 = pow(m, e1, N) |
原理分析
1 | from Crypto.Util.number import * |
2.公约数分解n
识别此类题目,通常会发现题目给了多个n,均不相同,并且都是2048bit,4096bit级别,无法正面硬杠,并且明文都没什么联系,e也一般取65537。可以直接gcd(n1,n2)
求出一个因数,进而分解n,得到另一个因数
1 | n1=9051013965404084482870087864821455535159008696042953021965631089095795348830954383127323853272528967729311045179605407693592665683311660581204886571146327720288455874927281128121117323579691204792399913106627543274457036172455814805715668293705603675386878220947722186914112990452722174363713630297685159669328951520891938403452797650685849523658191947411429068829734053745180460758604283051344339641429819373112365211739216160420494167071996438506850526168389386850499796102003625404245645796271690310748804327 |
3.低加密指数分解攻击
在RSA中e也称为加密指数。由于e是随机选取的,如果选取的e太小,导致m^e仍然比模数N来的小,相当于密文C只是明文的e次方而已,可以对密文进行开方即可得到明文
1 | e=2 |
也有可能e的三次方会比n大但是大不了太多,可以进行爆破,每次多加一个n。
1 | n=0x9683f5f8073b6cd9df96ee4dbe6629c7965e1edd2854afa113d80c44f5dfcf030a18c1b2ff40575fe8e222230d7bb5b6dd8c419c9d4bca1a7e84440a2a87f691e2c0c76caaab61492db143a61132f584ba874a98363c23e93218ac83d1dd715db6711009ceda2a31820bbacaf1b6171bbaa68d1be76fe986e4b4c1b66d10af25 |
1 | i = 0 |
4.Rabin加密算法
Rabin加密算法是一种RSA 的衍生算法,特征是e=2.
加密原理
解密原理
- 计算出
- 扩展欧几里得计算出a和b
- 解出四个明文
解密脚本
1 | def rabin_decrypt(c, p, q, e=2): |
5.低解密指数攻击(CTFSHOW-RSA5)
在RSA中d也称为解密指数。当d比较小的时候,或者说e特别大的时候
适用情况:e过大或过小(一般e过大时使用)可使用算法快速推断出d的值
引用RSA-wiener——attack https://github.com/pablocelayes/rsa-wiener-attack
下下来之后新建一个python库,把.py文件都放进去。引用时会报错,大概就是修改几个import,之后就可以用了
1 | from Crypto.Util.number import * |
5.dp,dq泄露(已知p、q、dp、dq、c)(BUU-RSA1)
简单说明dp,dq参数是为了让解密更快的产生
- dp=d%(p-1)
- dq=d%(q-1)
1 | import gmpy2 |
6.dp泄露
不同于上面的dp,dq泄露,需要一些其他技巧
原理
求解脚本
1 | def getd(n,e,dp): |
7.中国剩余定理的应用
问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
这是很典型的中国剩余定理的问题,要明白中国剩余定理,需要明白上述问题的解决方法,自行掌握
给出一个题目的解题脚本
1 | from Crypto.Util.number import * |