本文介绍了在CTF比赛中密码学中常用的工具及python库:简要讲解了安装方法,常用的使用方法。
RSA常用工具
RSAtool
- 任意给定两个素数(p,q)或者(模数n,私钥d)都可以计算出RSA(p,q,n,d,e)及RSA-CRT (dP, dQ, qInv)
- 返回参数可以以pem或der文件格式保存私钥文件
安装
- git clone https://github.com/ius/rsatool.git
- cd rsatool
使用
根据p,q生成私钥文件key.pem
python rsatool.py -f PEM -o key.pem -n 13826123222358393307 -d 9793706120266356337
Using (n, d) to initialise RSA instance n = 13826123222358393307 (0xbfe041d1197381db) e = 65537 (0x10001) d = 9793706120266356337 (0x87ea3bd3bd0b9671) p = 4184799299 (0xf96ef843) q = 3303891593 (0xc4ed6289) Saving PEM as key.pem
提供(p,q)生成key.der
python rsatool.py -f DER -o key.der -p 4184799299 -q 3303891593
Using (p, q) to initialise RSA instance n = 13826123222358393307 (0xbfe041d1197381db) e = 65537 (0x10001) d = 9793706120266356337 (0x87ea3bd3bd0b9671) p = 4184799299 (0xf96ef843) q = 3303891593 (0xc4ed6289) Saving DER as key.der
openssl
openssl可以查看公钥得到n和e,也可以利用私钥文件解密公钥加密的内容
安装
- kail中自带
- windows下可安装:OpenSSL-Win32
使用
查看公钥文件
openssl rsa -pubin -in pubkey.pem -text -modulus
解密
rsautl -decrypt -inkey private.pem -in flag.enc -out flag
整数分解工具
网站分解:http://factordb.com/
命令行分解:factordb-pycli,借用 factordb 数据库:https://github.com/ryosan-470/factordb-python
安装
FactorDB存储了已经知道的整数的分解,这个工具可以在命令行上使用,对python2和python3也适用
本地对应pip安装即可:
pip3 install factordb-python
更新factordb-python
pip3 install --upgrade factordb-python
使用
命令行使用
C:\Users\fishmouse>factordb 16
2 2 2 2
获得更多信息:
C:\Users\fishmouse>factordb --json 16
{"id": "http://factordb.com/api/?id=2", "status": "FF", "factors": [2, 2, 2, 2]}
FacotrDB库的使用
1 | from factordb.factordb import FactorDB |
1 | f.get_factor_list() |
[]
1 | f.connect() |
<Response [200]>
1 | f.get_factor_list() |
[2, 2, 2, 2]
1 | f.get_factor_from_api() |
[['2', 4]]
1 | f.get_status() |
'FF'
yafu本地分解
windows下使用
xxx\yafu-1.34> .\yafu-x64.exe
factor(21)
RSA常用python库
gmpy2
windows下安装
whl文件形式安装,下载对应python版本的whl文件:https://www.lfd.uci.edu/~gohlke/pythonlibs/
pip3 install gmpy2-2.0.8-cp37-cp37m-win_amd64.whl
kail中安装
安装gmpy2这个库还需要一些相应的环境mpfr和mpc
首先安装mpfr,因为要安装mpc必须先安装mpfr
root@kali:~# wget https://www.mpfr.org/mpfr-current/mpfr-4.1.0.tar.bz2
若失败到官网:https://www.mpfr.org/mpfr-current查看最新
root@kali:~# tar -jxvf mpfr-4.1.0.tar.bz2
root@kali:~# cd mpfr-4.1.0
root@kali:~/mpfr-4.1.0# ./configure
root@kali:~/mpfr-4.1.0# make && make check && make install
安装mpc
root@kali:~# wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
root@kali:~# tar -zxvf mpc-1.1.0.tar.gz && cd mpc-1.1.0
root@kali:~/mpc-1.1.0# ./configure
root@kali:~/mpc-1.1.0# make && make check && make install
安装gmpy2
root@kali:~# pip3 install gmpy2
常用函数
gmpy2.gcd最大公约数
1 | import gmpy2 |
mpz(2)
gmpy2.invert求逆元
1 | gmpy2.invert(5,26) |
mpz(21)
gmpy2.gcdext求逆元
1 | gmpy2.gcdext(5,26)#传入(a,b);返回最大公约数、x、y :g= ax+by |
(mpz(1), mpz(-5), mpz(1))
gmpy2.iroot开次方根
1 | gmpy2.iroot(4,2) |
(mpz(2), True)
libnum
pip安装
pip3 install libnum
常用函数
libnum.gcd求最大公约数
1 | import libnum |
2
libnum.invmod求逆元
1 | libnum.invmod(5,26) |
21
libnum.xgcd扩展欧几里得
1 | libnum.xgcd(5,26)# xgcd(a,b)返回:x,y,g ;ax+by=g |
(-5, 1, 1)
libnum.s2n字符串转为整数
1 | libnum.s2n("hell0") |
448378203184
libnum.n2s整数转换为字符串
1 | libnum.n2s(448378203184) |
'hell0'
pycryptodome
pip安装
pip3 install pycryptodome
安装后,可以使用Crypto这个模块,注意点:在对应python下的库Lib\site-packages中crypto开头为小写时,将其改为Crypto即可
小结
整数到字符串(字节串的相互转换)
整数和字符串
1 | # 字符串到整数 |
448378203247
1 | # 整数到字符串 |
'hello'
整数和字节串
1 | # 字节串到整数 |
448378203247
1 | # 整数到字节串 |
b'hello'
素数产生
脚本
1 | # 检测大整数是否是素数,如果是素数,就返回True,否则返回False |
602912217591119
libnum
1 | import libnum |
936552131
1 | libnum.generate_prime_from_string("abc") |
418262526581
Crypto.Util.number
1 | from Crypto.Util.number import getPrime |
930767861
rsa库简单使用
密钥生成
1 | import rsa |
(PublicKey(210654150686773160921155565886246123127, 65537),
PrivateKey(210654150686773160921155565886246123127, 65537, 45430608142070156598272456648718438625, 245259021963773848463, 858904797874827929))
rsa加密
1 | m = "hello".encode('utf-8') |
b']\xd6\xb2w\xc4\x89[\xfcu`\x0b&\xa0\xc9`\xd2'
rsa解密
1 | rsa.decrypt(b']\xd6\xb2w\xc4\x89[\xfcu`\x0b&\xa0\xc9`\xd2',privkey) |
b'hello'
公钥文件查看方式
openssl
openssl rsa -pubin -in pubkey.pem -text -modulus
rsa库
1 | import rsa |
私钥文件生成方式
rsatool.py
python rsatool.py -f PEM -o prvkey.pem -p 4184799299 -q 3303891593
from Crypto.PublicKey import RSA
1 | # coding=utf-8 |
根据私钥文件读取公钥加密后密文方式
利用rsa库直接读
1 | import rsa |
利用openssl
OpenSSL> rsautl -decrypt -in test.enc -inkey private.pem
字符串异或
Crypto.Util import strxor
1 | from Crypto.Util import strxor |