RSA加密攻击练习(一)

RSA加密攻击练习(一)

RSA相关前置知识概括

RSA算法主要是基于,将一个大数字做质数分解很困难,下面简单介绍一下所需的数学知识,主要写结论,做题拿来用即可,证明过程有兴趣可以自己研究。

欧拉函数

通常用 φ(n) 表示,表示小于n的正整数中与n互质的数的数目。

n 为质数的时候,有公式 φ(n) = n - 1

n 可以拆分成两个素数(p和q)的乘积的话,有公式 φ(n) = (p - 1)(q - 1)

因为大数拆分成两个素数的乘积很难,这一步是RSA算法安全性的关键。

同余

若存在整数ab ,除以m 的余数相同,则称a,b mod m 同余,记为a ≡ b (mod m)

模逆元

在模运算中,a^-1 不是1/a ,是 ax ≡ 1 (mod m)x的值。

在python中pow(a,-1,m) ,就是按照上面这样计算出x的值。

欧拉公式

mn 互为质数,则满足m^φ(n) ≡ 1(mod n)

证明过程参考拉格朗日定理。

lcm 与 gcd

分别代表least common multiple(最小公倍数),greatest common devisor(最大公约数)。

互质

两个正整数ab 互质意味着能同时被它们整除的数只有1,即gcd(a, b) = 1

RSA加密解密过程

公钥和私钥都是密钥核心模数组成的。

假设公钥是 (e,n) ,私钥是 (d,n) ,其中n 是模数,另外的e 或者d就是密钥核心。

明文是m ,密文是c

公钥是公开的,所有人可以随意获取,私钥是只有自己拥有的,必须保密不让其他人知道。

  1. 首先,发送方有公钥和要加密的明文,也就是e,n,m ,我们把它加密为c
ini 复制代码
m^e ≡ c (mod n)
c = m^e mod n
  1. 然后,接收方有私钥和加密的密文,也就是 d,n,c ,解密以后就可以读取明文m
ini 复制代码
c^d ≡ (m^e)^d ≡ m (mod n)
m = c^d mod n

这样的话,别人用了自己公钥加密的消息,就只有自己可以读取内容了,其他人无法读取。

私钥的计算方法

  1. 首先我们知道下面这个:
scss 复制代码
m^e ≡ c (mod n)
c^d ≡ (m^e)^d ≡ m (mod n)
  1. 所以我们可以推断出:
scss 复制代码
m^(e*d) ≡ m (mod n)
  1. 根据前文的欧拉公式我们知道有这样一个结论,在mn互质的时候:
scss 复制代码
m^φ(n) ≡ 1 (mod n)
  1. 于是我们联立2和3的公式发现以下结论:
ini 复制代码
e*d =(k*φ(n)+1)
等价于:
e*d = 1 (mod φ(n))

也就是说de模φ(n) 的乘法逆元。同时前文说了我们知道有公式 φ(n) = (p - 1)(q - 1) ,所以拿到p和q ,可以算出φ(n),就可以求出d了。

常见的做题流程

通常我们是得知了c ,e ,n ,然后需要在不知道密钥d 的情况下,求加密前的明文m

  1. 首先,我们通过这个小网站去拆分p和qfactordb.com/index.php?q...
  2. 我们计算出phi ,也就是φ(n)
css 复制代码
phi = (p - 1) * (q - 1)

3.通过python的inverse 函数或者pow 函数都可以算出d ,其中inverse 函数需要Crypto.Util.number组件:

ini 复制代码
d = inverse(e, phi)
或者
d = pow(e, -1, phi)

4.最后用pow函数计算结果:

ini 复制代码
m = pow(c, d, n)

通常m就是flag了。

实战刷题

由于现在还没有系统的刷完一个平台的RSA题目,所以没有对RSA所有的攻击手段全部总结详细。

暂时在这里把刷题碰上过的一些简单的en有关的问题总结一下。

n自己就是个素数

如果n 自己就是一个大的素数,那么φ(n) = p - 1

n拆分出来是两个一样的素数

如果只生成了一个大素数,平方出来的n,那么φ(n) = p(p - 1)

n拆分出来是很多很多个素数的乘积

那么φ(n) = (p1 - 1)(p2 - 1)(p3 - 1)(p4 - 1)(p5 - 1)(p6 - 1)(p7 - 1)(p8 - 1)···,也就是每一个数字都要参与一次计算。

e=1时

明文会与密文相等,可以直接将密文c转化为字符串解密。

e=3时

通常在题目中,n是一个非常大的数字,而题目要求的flag通常不是一句很长的字符串,所以在公式 m^e ≡ c (mod n) 中,mod n 很有可能压根没有用上,因为flag (也就是m )只取三次方,依旧是比n 小太多,求余数压根就是自己本身,所以flag^3 = c ,直接将c 开三次方即可求出明文,如果e 太小可以这样计算。这里可以使用gmpy2的iroot函数来计算。

总结

记录了一下rsa的基本原理,需要依赖的数学结论,以及做题的基本流程与目前遇到的部分题目的解题过程,主要是按照cryptohack网站的顺序来学习的,后面的题目暂时还没研究清楚,等后面的题目研究透彻了以后,再根据现有的各类RSA攻击类型来给题目进行归类总结。

参考资料

cryptohack.org/

zhuanlan.zhihu.com/p/162712809

zhuanlan.zhihu.com/p/255170124...

相关推荐
自由鬼1 小时前
正向代理服务器Squid:功能、架构、部署与应用深度解析
java·运维·服务器·程序人生·安全·架构·代理
dingzd953 小时前
了解去中心化金融在现代经济中的作用——安全交易新时代
安全·金融·web3·去中心化·facebook·tiktok·instagram
weixin_472339463 小时前
网络安全基石:从弱口令治理到动态防御体系的构建
安全·web安全
代码改变世界ctw4 小时前
1.4 ARM安全参考架构(PSA Certified)
arm开发·安全·arm·trustzone·atf·optee·安全启动
网安小白的进阶之路9 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-2
网络·安全·web安全·系统安全·交换机
安全系统学习9 小时前
网络安全之RCE分析与利用详情
服务器·网络·安全·web安全·系统安全
武汉唯众智创9 小时前
网络安全实训室建设方案全攻略
网络·安全·web安全·网络安全·网络安全实训室·网络安全实验室
weixin_472339469 小时前
网络安全攻防:文件上传漏洞的深度解析与防御实践
安全·web安全
雪兽软件9 小时前
2025 年网络安全与人工智能发展趋势
人工智能·安全·web安全
小黄人202511 小时前
自动驾驶安全技术的演进与NVIDIA的创新实践
人工智能·安全·自动驾驶