【中秋第二弹】手把手教你攻克CTF密码学!

本文详细讲解了如何使用Python库解决CTF中的密码学问题,特别是RSA算法。介绍了分解大整数的工具如factordb、msieve和yafu,以及Python库libnum和gmpy2的使用。还讨论了sage在矩阵运算和解方程上的应用,以及Crypto库的使用,包括对称和非对称加密、哈希和数字签名。此外,还涵盖了数据类型转换和解密策略,如Oracle攻击和共模攻击。
摘要由CSDN通过智能技术生成

本文章主要是详细的讲解如何合理选择工具或者python的三方库来解决常见的CTF中密码学相关问题,针对偏门或者高深的密码学知识点,作者表示也无能为力!

RSA


现在 RSA 在 CTF 比赛中一般作为简单题甚至签到题出现!如果你还不了解 RSA,那机会来了,赶紧跟着来学一学怎么解 RSA 这纸老虎!

  • 分解大整数

RSA 中常用的运算有三个:分解大整数,求逆元以及模幂运算。一般分解大整数有三个常用的工具 factordbmsieve 以及 yafu,如果这三个都不能分解大整数,那就要不要强行分解了,多半是其它思路。

在线 factordb
msieve和yafu的 网盘链接

使用方法:
factordb离线,命令行 factordb xxx
msieve.exe -q xxx
yafu-x64.exe factor(xxx)
yafu-x64.exe "factor(@)" -batchfile xxx.txt

  • libnum与gmpy2

建议安装在:windows-python2
当我们分解大整数之后,我们需要用到的 python2 的库有两个 libnumgmpy2,这两个库建议在 windows 下安装,安装过程简单许多

链接: 百度网盘 密码: inbd

我建议用 libnum 转换整数与字符串,gmpy2 用来作核心的运算,libnum 常用的几个函数有

# Encoding=UTF-8
from libnum import *
#
s2n(str) # 字符串转整数
n2s(n) # 整数转字符串,任意进制数也能直接转,它会先把任意进制数转成16进制数
s2b(str) # 字符串转2进制位串
b2s(bin) # 2进制位串转字符串
复制代码

gmpy2常用的几个函数有

# Encoding=UTF-8
import gmpy2
#
gmpy2.mpz(x) # 初始化一个大整数x
gmpy2.mpfr(x) # 初始化一个高精度浮点数x
C = gmpy2.powmod(M,e,n) # 幂取模,结果是 C = (M^e) mod n
d = gmpy2.invert(e,n) # 求逆元,de = 1 mod n
gmpy2.is_prime(n) # 判断n是不是素数
gmpy2.gcd(a,b) # 欧几里得算法
gmpy2.gcdext(a,b) # 扩展欧几里得算法
gmpy2.iroot(x,n) # x开n次根
复制代码
  • 神器sage

懒人的话建议在线使用
sage 非常适合用来做大数运算、矩阵运算、数论以及解方程,所以说 sage 用来解 RSA 中的大数方程再适合不过了。我这里有个 sage中文文档,这东西要研究透彻还是挺难的!下面会列出一些解方程基本用法

# encoding=utf-8
# 解方程
var('x y')
solve([x+y==10,x*y==21],[x,y])
# 其它
inverse_mod(e,fn) # sage求逆元
pow(m,e,n) # sage模幂运算
复制代码

在线sage运算

  • RSA解题思路

1)如果遇到题目给了 pem 或者 key 后缀结尾的文件,就需要用 Kali 自带的 OpenSSL 从公钥文件中提取出 e 和 n。命令如下:
openssl rsa -pubin -text -modulus -in key.pem

2)当我们有 n,e,c 时,我们就要尝试分解 n,因为分解 n 能得到 fn,从而求得 e 的逆元 d,根据 d 再对密文 c 求模幂,最终得到明文 m

3)当 n 不能使用常规手段分解时,就需要考虑其它的思路了,这里是大佬总结的思路传送门。然后我也总结了一些经典且常用的 RSA 套路
模不互素-这是最简单的情况了,对两个模数N1,N2求最大公约数,然后愉快的分解模数
共模攻击-给了两段密文c,这两段密文是用同一个明文m以及模数n和各自的e加密得到的。意思就是 e不同,n和m相同,这种情况能用共模攻击直接解出明文m
低加密指数-e就是加密指数,当e很小时,c = m ^ e mod n,当 m^e < n 时,直接对n开e次根就得到了m,或者当 c = m^e + kn,此时的 k也非常小,可以爆破k的值
低解密指数-d就是解密指数,当d非常小时,即e很大,此时可以用 rsa-wiener-attack 攻击,rsa-wiener-attack的源码在Github
选择密文攻击-我们可以给定一个密文,然后系统返回给我们对应的明文

假如原始密文 C = M ^ e mod n,我们选择一个 X (X与n互素),再计算一个密文为 C2 = C * (X ^ e) mod n,将他发送给解密系统,系统返回我们一个明文 M2 = C2 ^ d mod n,此时表达式为:M2 = C2 ^ d = (C * (X ^ e)) ^ d = (C ^ d) * X = ((M ^ e) ^ d) * X = M * X mod n,注意 d * e = 1。此时求 M 就相对容易了,M = M2 * (X ^ -1) mod n

RSA LSB Oracle Attack-我们发送任意的密文,系统可以返回给我们该密文对应明文的奇偶性

攻击原理:因为 C = M ^ e mod n,当我们发送 C * (2 ^ e) 时,相当于系统返回给我们 2M mod n 的奇偶性,且我们知道 2M ^ e 为偶数,n 为奇数。当返回为奇数时,说明 2M - kn 为奇数,那么 k 必定为奇数,又 2M < 2n,k < 2,所以 k = 1,那么 n/2 <= M < n;当返回偶数时,说明 2M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值