CTF-Crypto-RSA基本原理及常见攻击方法

本文详细介绍了RSA算法的数学背景,包括互质、欧拉函数和模反元素,深入浅出地讲解了非对称加密的工作原理,以及在CTF挑战中的各种应用场景,如密钥计算、密文破解和低指数攻击等。

0X00 RSA简介:

1977年,三位数学家Rivest、Shamir 和 Adleman
设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。
从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。

0X01 数学背景:

互质

从小学开始,我们就了解了什么是质数。互质是针对多个数字而言的,如果两个正整数,除了1以外,没有其他公因子,那么就称这两个数是互质关系(注意,这里并没有说这两个数一定是质数或有一个为质数。比如15跟4就是互质关系)。以下有一些关于质数与互质的性质:

1:质数只能被1和它自身整除
2:任意两个质数都是互质关系
3:如果两个数之中,较大的那个数是质数,则两者构成互质关系
4:如果两个数之中,较小的那个数是质数,且较大数不为较小数的整数倍,则两者构成互质关系 1和任意一个自然数是都是互质关系
5:p是大于1的整数,则p和p-1构成互质关系 p是大于1的奇数,则p和p-2构成互质关系


欧拉函数

欧拉函数是求小于x并且和x互质的数的个数。其通式为:φ(x) = x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)。
其中p1, p2……pn为x的所有质因数,x是不为0的整数。看到这里是不是有一些头疼,太理论的东西的确不够具象。我们且不去理会后面公式计算与论证,因为已经超出本文的范围了。就前一句来说说吧,欧拉函数是求小于x并且和x互质的数的个数。这里我可以列举一个例子:
令x = 16,那么x的所有质因数为:φ(16) = 16 * (1 - 1/2) = 8
我们也可以枚举出所有比16小,且与16互质的数:1, 3, 5, 7, 9, 11, 13, 15

欧拉函数的性质具体可以百度


模反元素

定义:如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。

关于模反元素的求解,使用的是朴素的解法。如果想要更进一步了解的话,请自行搜索其他解法(比如:辗转相除法、欧几里德算法)。

0X03 RSA原理

RSA是一种算法,并且广泛应用于现代,用于保密通信。

RSA算法涉及三个参数,n,e,d,其中分为私钥和公钥,私钥是n,d,公钥是n,e

n是两个素数的乘积,一般这两个素数在RSA中用字母p,q表示,e是一个素数, d是e模varphi(n)
的逆元,d是由e,p,q可以求解出的

> > > 一般CTF就是把我们想要获得的flag作为明文,RSA中表示为m,然后通过RSA加密,得到密文,RSA中表示为C。

加密过程

c=m^e mod n

c=pow(m,e,n)

解密过程

m=c^d mod n

m=pow(c,d,n)

求解私钥d

d = gmpy2.invert(e, (p-1)*(q-1))

一般来说,n,e是公开的,但是由于n一般是两个大素数的乘积,所以我们很难求解出d,所以RSA加密就是利用现代无法快速实现大素数的分解,所存在的一种安全的非对称加密。

0X04 CTF中常见的类型:

1,已知 p ,q,e 求 d

(ed 除以 (q-1)(p-1) 的 余数 为 1
import gmpy2
p = 38456719616722997
q = 44106885765559411
e = 65537
s = (p-1)*(q-1)
d = gmpy2.invert(e,s)
print ("dec: " + str(d))
print ("hex: " +  hex(d))

2,已知 n(比较小),e 求 d

(n = q * p , ed 除以 (q-1)(p-1) 的 余数 为 1(n往往是一个 1024bit 的超大数,很难分解为两个 质数)

n的分解使用yafu 中的 factor(t) 命令 ,简单的也可以使用在线网站

3,已知 公钥(n, e) 和 密文 c 求 明文 m
方法一:(n,e不太大的情况下)
首先将 n 分解为 q 和 p

再利用脚本 :

import libnum
from Crypto.Util.number import long_to_bytes
 
c = 0x6cd55a2bbb49dfd2831e34b76cb5bdfad34418a4be96180b618581e9b6319f86
n = 108539847268573990275234024354672437246525085076605516960320005722741589898641
#n = int("",16)
e = 65537
#e = int("",16)
q = 333360321402603178263879595968004169219
p = 325593180411801742356727264127253758939
 
d = libnum.invmod(e, (p 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值