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...

相关推荐
xiaojiesec1 小时前
第159天:安全开发-Python-协议库爆破&FTP&SSH&Redis&SMTP&MYSQL等
运维·安全·ssh
世界尽头与你2 小时前
安全热点问题
安全·网络安全
小小工匠2 小时前
加密与安全_HTTPS TLS 1.2 连接(RSA 握手)的整个过程解读
安全·https·tls
low神3 小时前
前端在网络安全攻击问题上能做什么?
前端·安全·web安全
云卓科技4 小时前
无人机之激光避障篇
科技·安全·机器人·无人机·制造
网络研究院4 小时前
大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元
网络·人工智能·安全·语言模型·攻击·劫持
网络研究院5 小时前
企业急于采用人工智能,忽视了安全强化
网络·人工智能·安全·工具·风险·企业
白帽黑客cst5 小时前
网络安全(黑客技术) 最新三个月学习计划
网络·数据结构·windows·学习·安全·web安全·网络安全
网络研究院5 小时前
网络安全:建筑公司会计软件遭受暴力攻击
网络·安全·研究·漏洞·报告·分析
世界尽头与你7 小时前
活动目录安全
安全·网络安全·内网安全