Crypto
0x01 TryLanguageC
1 |
|
flag:
1 | I love cryptography |
0x02 Caesar
1 | def decryption(): |
flag:
1 | jnctf{it's reelly ez} |
0x03 Affine
将文件下载后更改后缀为.zip得到密文和加密函数
可以通过在线解密或Affine解密脚本得到明文
揭秘脚本:
1 | from Crypto.Util.number import * |
flag:
1 | jnctfahappyday |
0x04 EasyRSA
思路
读源码
1 | p = getPrime(1024) |
说明 r > 1/2 * p 且 r < 2*p
而
1 | while True: |
说明 q > 3*p
又因为 n = pqr
所以 p^3 < 1/2 * p * 3 * p * p
即 p^3 < 3/2 * p ^ 3 < n
所以 p3 = p^3
而 q3 是否 满足 q3 < n 不可证
但知道 q 与 p 的关系 即可求 q
知道 p q 密文可解
脚本
1 | from Crypto.Util.number import * |
flag
1 | jnctf{now_you_know_rsa} |
0x05 solve_equations
p
和q
均形如x^4+a
其中x
是128位的数,而a
是70位的数。
设p=x^4+a
,q=y^4+b
可得n=p*q=(x*y)^4+a*y^4+b*x^4+a*b
由于a和b过小
,如果对n
直接开四次方根,可以得到n^(1/4) == x*y
1 | n = 642490594376281618207440246293358130347533059333546608004801465962276986228377845074254331568169118625276515856878556004934816290475626584329280631731598984725780235581589177352281229458875318652667477178023489539936535622122070992295011875672812842065244674297547830376624928904526157378639668903760372743843 |
解得n_root = 159208662382575641221158086761470934954896410873779789839060715818024475381282
于是可以根据n^(1/4) == x*y
以及p=x^4+a
,q=y^4+b
求解x和y
其中a,b
均已知,使用sage求解方程
1 | sage: n_root = 159208662382575641221158086761470934954896410873779789839060715818024475381282 |
找出其中整数解:
1 | x = 442580207023874647465714745974078721831 |
由此可求p、q
1 | from gmpy2 import * |
flag:
1 | jnctf{b3st_crypt0} |