crypto writeup
古典美
密钥:VklHRU5FUkU=
密文:
HHCKPDQEGUFXFCKHBZXXVQAAHZYHVDSYBQEHXRUHHCEXXSADBGEXZRCHBYEHTBAEH4GJEMFS
密钥用base64解码:VIGENERE,作为维吉尼亚的密钥。
解密密文得到:
MZWGCZZALMZTSYTDGRRTIMJWMRSDIZBUGIYDKNDDMUYTKOJZGYYTMNLDGQYDGXJAM4YDAZBB
只有A-Z和数字,因此采用base32解码: flag [39bc4c416dd4d42054ce15996165c403] g00d!
(忘记题目)
题目考察的点是在RSA中,如果已知公钥对(e, n)对应的私钥对(d, n),有办法分解出p, q的值。参考https://www.di-mgt.com.au/rsa_factorize_n.html
这道题首先第一部分用正常的d解密就好:
1 | from Crypto.Util.number import * |
再由e,d,n分解出p,q。
1 | import java.math.BigInteger; |
从而得到p,q的值。
1 | from Crypto.Util.number import * |
两部分连接起来就是flag的值。
RSA_upgrade
题目代码:
1 | import random |
典型的m,c,n未知时候的LCG。首先求出m,c,n及seed的值,有多个可能的值,代回原来的lcg函数比对生成的6个值。具体公式推导见 https://blog.csdn.net/superprintf/article/details/108964563 (写的真不错)
1 | from Crypto.Util.number import * |
e是lcg的第7个值的下一质数,这样就能得出e。
1 | import random |
发现是三质数的RSA。这里有个坑,跟BMZCTF2020里一样。因为p,q,r两两互素,所以不需要知道q,r的值,利用phi(p)=p-1就可以得到d的值。
1 | import gmpy2 |
有了明文,但并不是真正的flag。明文是flag异或上flag >> 10的值,flag头部’DASCTF{‘,但只移动了10bits,因此理论上每10bit一组交替异或,可以逆推出flag的值。
1 | from Crypto.Util.number import * |
rsa4
1 | from Crypto.Util.number import * |
m是由flag向右移120后再向左移120位得到,m高位泄露,低位的120比特未知。加上e = 3,可以联想到coopersmith的高位攻击。以前的coopersmith定理的题目一般是已知p的高位,爆破出完整的p来分解n。 sage里面的small_roots实现了LLL算法求解非线性低维度多项式方程小根的方法。
1 | from Crypto.Util.number import * |
MEET
题目代码:
1 | from Crypto.Cipher import DES |
2DES的中间相遇攻击。已知一组明密文[12345678, D4meWwYAUE4=],能够爆破出k1k2的值。满足:
1 | c = e2.decrypt(e1.encrypt(msg)) |
因此先遍历k1加密明文后的值放入一个数组1,再遍历k2加密密文c后的值放入数组2,比较数组1和数组2找相同的中间值,根据中间值计算对应的k1和k2。
1 | from Crypto.Cipher import DES |