花了半天的时间,把NSSCTF上SWPU的题目做了一遍,做一些总结。
happy
1 | ('c=', '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL') |
z3直接解方程,这里很容易上当,以为两个大数求gcd就是q,实际上并不是。
1 | import binascii |
traditional
1 | 题目: |
经典的八卦图和01序列对照,这里要注意它是每九位二进制数为一个ascii码:
1 | dic = {'震':'001','坤':'000','艮':'100','巽':'110','兑':'011','离':'101',} |
crypto4
1 | from gmpy2 import * |
分解模数n,由于p和q差距太小,于是可以利用费马分解:
p-q非常小,爆破来获得真实的p+q值,然后联立p*q = n解方程。
1 | from gmpy2 import * |
也可以用factor分解,因为factor就是用的费马分解算法。
crypto5
1 | flag= 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333 |
很显然密文比n小太多了,大概率是小指数,没给e,遍历1到10即可。
1 | from Crypto.Util.number import * |
crypto9
利用密文前六个AKKPLX和NSSCTF对照,得到key为13,18,18。
1 | #AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984} |
rrrsssaaa
1 | from Crypto.Util.number import * |
p3,q3,r3都是小指数加密得到的,但只有p3位数比n小一位,于是直接对p3开方得到p,再利用p,q,r的生成算法得到q,r。最后求phi,d解密。
1 | from Crypto.Util.number import * |
Vigenere
非变异类维吉尼亚,在线解密网站梭。
automatic
1 | from Crypto.Util.number import * |
和服务器交互进行778次共模攻击:
1 | from pwn import * |
crypto1
1 | from gmpy2 import * |
同一个m用同一个n加密,显然是共模攻击,但如果只停留在套脚本的程度这种题就很难做出来,还得理解清楚原理。
则可利用:
求m,这里x和y有一个是负数,需要将负数改为对n求逆。或者用pow(c1,x,n)计算,在modn的条件下它会自动把符号转为逆。
本题只给了e1e2的乘积,所以需要先分解这个乘积:
那么可取3和7来组合相乘得到e1和e2,但是e1和e2大概率有公因子(3或7),这就需要先求两者的公因子,分别先除以公因子,再把新的e1和e2求x和y,这样用共模攻击求出的是m^3或者m^7,试着直接开根或者加上kn开根得到flag。
1 | import gmpy2 |
crypto3
1 | from gmpy2 import * |
一元copper,参见NPUCTF2020-共模攻击
1 | n = 140457323583824160338989317689698102738341061967768153879646505422358544720607476140977064053629005764551339082120337223672330979298373653766782620973454095507484118565884885623328751648660379894592063436924903894986994746394508539721459355200184089470977772075720319482839923856979166319700474349042326898971 |