[WUSTCTF2020]B@se
密文:MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD==
JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs????kxyz012789+/
oh holy shit, something is missing…
base64的变异,缺少了四个未知字符,根据base64的字符集来找出缺少的值,并按照排列组合遍历所有可能性;然后将密文在新的base表中的位置带入常见的base64对应表中获得原始字符,最后解base64获得flag。
1 | import string |
[RoarCTF2019]babyRSA
威尔逊定理的考查,做过类似的题。
1 | import sympy |
exp:
1 | import sympy |
[NCTF2019]babyRSA
1 | from Crypto.Util.number import * |
题目给了c、d、e但没有n,因此需要想办法求出n,具体来说,可以通过ed和phi(n)的关系推导出p、q,再计算n。通过加密算法大体可以知道,p,q是1024位的,因此两者相乘不低于2048位,通过运算可知ed-1为2064位,因此k介于2^15到2^17之间,因此可以在小范围内对k进行遍历。最后,对phi(n)开方的结果比较接近于p、q,可以在这个值附近取质数。
exp:
1 | e=0x10001 |
[WUSTCTF2020]大数计算
1 | import sympy |
[网鼎杯 2020 青龙组]you_raise_me_up
1 | #!/usr/bin/env python |
离散对数求解问题:
1 | flag=sympy.discrete_log(2**512,c,m) #可用sympy库下的discrete_log |
1 | m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075 |
RSA & what
题目第一部分求解就是共模攻击,解出来的结果是一串由\n隔开的base64编码,解码出来不是flag;进一步了解知道是base64隐写。
base64隐写学习:https://blog.csdn.net/xnightmare/article/details/103774379
exp:
1 | from Crypto.Util.number import* |
[MRCTF2020]babyRSA
1 | import sympy |
伪随机数的预测,exp:
1 | from Crypto.Util.number import * |
[NPUCTF2020]EzRSA
1 | from gmpy2 import lcm , powmod , invert , gcd , mpz |
gift = lcm(p - 1 , q - 1)是解题的关键,p-1和q-1的最小公倍数实际上等于(p-1)*(q-1)除以两者的最大公因数;而p-1和q-1都是偶数(有公因子2),所以(p-1)和(q-1)的乘积等于最小公倍数乘2的倍数,不断尝试发现max公因子为8。
1 | from gmpy2 import invert,iroot |
[ACTF新生赛2020]crypto-classic1
维吉尼亚密码,先求key再解密:
1 | import string |
[BJDCTF2020]Polybius
polypius加密,exp:
1 | import itertools |
[MRCTF2020]Easy_RSA
总结经验两点:
1.z3库可用来解rsa的p、q联立的方程
2.ed-1//n和ed-1//phi非常接近,通常只差1或者2
exp:
1 | from z3 import * |
[ACTF2020]crypto-aes
1 | from Cryptodome.Cipher import AES |
[UTCTF2020]hill
希尔密码,直接去爆破逆矩阵就行了。
1 | import string |
[NPUCTF2020]认清形势,建立信心
1 | from Crypto.Util.number import * |
exp:
1 | c=169169912654178 |
[AFCTF2018]Tiny LFSR
只需要异或求出key就可以利用lfsr序列进行解密,不需要逆推反馈移位寄存器。
1 | with open("cipher.txt","rb") as ff: |
[ACTF新生赛2020]crypto-des
根据提示压缩包密码可以通过数据类型转换转换成c语言的标准浮点数存储格式,然后再转成hex,最后把hex转化成字符串:
1 | from libnum import* |
解压得到加密脚本,已经给了轮密钥,直接解密即可。
1 | import pyDes |
[SUCTF2019]MT
刷到了自己战队老师傅出的题了^-^。这题可以用z3来逆运算,或者手动推导关系,但是这样太慢并且复杂,有师傅给出了一个新奇的思路,那就是把密文进行多轮加密,经过足够多次数以后就会得到明文。这种做法可以理解为:对某一固定长度的字符串进行移位和异或两种操作,其密文空间是有限的,因此只要不断加密就能得到明文。不知道算不算非预期。
1 | from Crypto.Random import random |
exp:
1 | from Crypto.Util import number |
[b01lers2020]safety_in_numbers
加密过程就是简单的RSA,但公钥文件pem很大,说明n或者e很大,这里可以用RSA模块来提取公钥:
1 | #!python3 |
但是时间较长,可以考虑另一种方法,这里需要看看公钥pem文件结构:https://www.cnblogs.com/yiyongling/articles/11365380.html
由此可知,base64的最后部分是模数e,notepad打开发现仅一行,说明e很小,直接提取出来,发现是0x10001,n那么大显然是小指数加密缺陷,直接开方即可。
1 | #!python3 |