Medium RSA
你没看错,这还真是密码学系列了,相信你已经解出前两题了,那么继续看这题吧。
读取一下公钥
1 | ➜ mediumRSA openssl rsa -pubin -in pubkey.pem -text -modulus |
或者通过python读取pem
1 | from Crypto.PublicKey import RSA |
factordb.com分解一下p和q,得到
p = 275127860351348928173285174381581152299
q = 319576316814478949870590164193048041239
然后求私钥d,解密文
1 | import libnum |
BrokenPic
这里有个图片,可是好像打不开?
Hint1: 图片大小是1366*768
按提示加上bmp头
有个key,bmp文件010 editor打开可以看到32位,32位的变换很规律,应该是aes加密
1 | from Crypto.Cipher import AES |
再加上bmp头,可以看到
PCTF{AES_i5_W3ak_foR_im4ge}
hard RSA
相信你已经做出了medium RSA,这题的pubkey在medium RSA的基础上我做了点手脚,继续挑战吧。
Hint1: 1.不需要爆破。2.用你的数学知识解决此题。3.难道大家都不会开根号吗?
如果按第一题那样做会发现求d的时候就会报错找不到e的模反数
ValueError: no invmod for given @a and @n
正如题目所说的动了下手脚……
因为题目里提到里开根号,所以做之前我要先说一点废话,关于开根号,网上大多wp里都用的gmpy2,那么我们先安装一下gmpy2,我是macos,按这篇文章里面linux的方法安装就行了,有几点要注意
- macos需要先安装xcode的Command Line Tools
- 文章里面安装MPFR的地址404了,需要去官网获取最新的
地址:www.cnblogs.com/pcat/p/5746821.html
然后可以通过gmpy2.iroot(n,e)
求n开e次方,返回一个元组,包括一个结果值和一个是否刚好n能开e次方的bool值。gmpy2安装稍微复杂,相比之下libnum也有求根函数,为libnum.nroot(n,e)
,但是只返回结果值。因为两个函数求根返回的结果值都是int型的,比如libnum.nroot(16,3)
,返回int型的值2,但是3^2=9不等于16,但是gmpy2.iroot(16,3)
,返回一个元组(mpz(2), False),然后我们可以通过元组的第二个元素判断是否刚好n能开e次方。当然也可以采用d = libnum.nroot(n,e)
求出d,然后判断n == pow(e,d)
关于libnum和gmpy2的开根号的区别就说到这里,很多密码学的题里都会用到这两个库,不过刚才安了gmpy2后发现,还是libnum好用,安装又简单
然后准备用小公钥指数攻击
爆破,爆破了几十秒,发现哪里不对劲,重新看下提示,说不用爆破。于是注意到这题rsa的e = 2,搜一下就会发现有个听着很吊的名字
Rabin 算法
看了下数学推理过程,发现看不懂,算了,还是拿着脚本上吧
1 | # coding=utf-8 |
very hard RSA
前几题因为N太小,都被你攻破了,出题人这次来了个RSA4096,是否接受挑战就看你了。
下载下来,发现这次多了一个python文件
1 | #!/usr/bin/env python |
可以看到,对一段密文分别用两个不同的公钥加密,但是两个公钥只有e不一样,模数n是一样的。于是很明显是共模攻击
1 | import gmpy2 |
Extremely hard RSA
没想到RSA4096都被你给破了,一定是我的问题,给了你太多信息,这次我只给你一个flag的加密值和公钥,仍然是RSA4096,我就不信你还能解出来。
先看下公钥
1 | ➜ extremelyhardRSA openssl rsa -pubin -in pubkey.pem -text -modulus |
emmm,看到e=3,那么应该是刚才hard RSA里面开始做时用的小公钥指数攻击
了,直接爆破
1 | # coding=utf-8 |
God Like RSA
既然你逼我到绝境,那就休怪我不客气了,代表上帝挑战你~
先读公钥
1 | ➜ godlikeRSA openssl rsa -pubin -in pubkey.pem -text -modulus |
然后题目给了个private.corrupted
1 | Private-Key: (4096 bit) |
4096bits的N,e又不小,正常是解不了了,但是给了个破损的私钥文件,需要修复私钥,google到的修复办法为
- given a candidate for
(p mod 16**(t - 1))
, generate all possible candidates for(p mod 16**t)
(check against mask for prime1) - calculate
q = n * invmod(p, 16**t)
(and check against mask for prime2) - calculate
d = invmod(e, 16**t) * (1 + k * (N - p - q + 1))
(and check against mask for private exponent) - calculate
d_p = invmod(e, 16**t) * (1 + k_p * (p - 1))
(and check against mask for exponent1) - calculate
d_q = invmod(e, 16**t) * (1 + k_q * (q - 1))
(and check against mask for exponent2) - if any of checks failed - check next candidate
修复脚本
1 | import re |
输出
1 | p = 30061432003658510087798871614869318011389940352798147030129806359975911392091235344042288409629143229311060231549478211871643725394470760528211801310601767727834886942210718412087541234398453046895030858579989874035849439867334906873642352112428914855967993998732685221108379784833027771293275558876952608462050146340591449046825135890871650866799299533696175818103240024841274114925018619060818213433528894936128306780366785977567327073724428211445259983614467640785163297734447975723664659822673456683284394386723716344090232882990461174301609971805075768328757325956784604364401827152431260896927633163074694121679 |
然后写入private.pem解密就行了
1 | from Crypto.PublicKey import RSA |
这里有个坑点是填充方式,不是PKCS1,而是PKCS1_OAEP,反正rsa填充方式就3种,一种一种试就行了,在线网站解方便一点
tool.chacuo.net/cryptrsaprikey
不过注意一下在线解密内容需要先base64,不然不可见字符你也输不进去。
1 | ➜ godlikeRSA cat flag.enc | base64 |
简单ECC概念
已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903
a = 16546484
b = 4548674875
G(6478678675,5636379357093)
私钥为
k = 546768
求公钥K(x,y)
提示:K=kG
提交格式XUSTCTF{x+y}(注意,大括号里面是x和y加起来求和,不是用加号连接)
注:题目来源XUSTCTF2016
那就先来了解一下ECC
ECC全称为椭圆曲线加密,EllipseCurve Cryptography,是一种基于椭圆曲线数学的公钥密码。与传统的基于大质数因子分解困难性的加密方法不同,ECC依赖于解决椭圆曲线离散对数问题的困难性。它的优势主要在于相对于其它方法,它可以在使用较短秘钥长度的同时保持相同的密码强度。目前椭圆曲线主要采用的有限域有
- 以素数为模的整数域GF(p),通常在通用处理器上更为有效。
- 特征为2的伽罗华域GF(2^m),可以设计专门的硬件。
baidu + google + duckduckgo 了一圈回来发现没有wp,网上关于ecc的ctf题少的可怜,这个什么XUSTCTF2016更是找不到这题的wp
那么照着ecc的定义自己算吧,什么离散函数,有限域的,略蛋疼,还好这题简单
1 | a = 16546484 |
神秘的压缩包
就不告诉你密码,看你怎么办。
注:题目来源XUSTCTF2016
crc32爆破
crc32_util.py
1 | # -*- coding: utf-8 -*- |
smdysb.py1
2
3
4
5
6
7
8
9
10
11from crc32_5byte import *
l = [0x20AE9F17,
0xD2D0067E,
0x6C53518D,
0x80DF4DC3,
0x3F637A50,
0xBCD9703B]
for k in l:
crc32_reverse(k, 5)
运行脚本
1 | ➜ crypto python smdysb.py |
这么多重合的crc32,巨坑,手动一个一个试,最后得到
password:f~Z-;lapEwF\<0ZkhyAo5
解压rar得到flag
XUSTCTF{6ebd0342caa3cf39981b98ee24a1f0ac}