crypto1_中秋月
题目以及hint:
密文:
hint:某古典密码;经此古典密码加密后,密文还是大写;keyword+plaintext (+plaintext…+plaintext);自动钥匙⊕;明文全大写,得到后转小写,并以_连接单词
⊕符号通常就是异或的表示,根据题意应该是明文经过加密以后(大写字母)还经过了异或才得到当前的密文,所以可以先尝试还原异或之前的大写字母:
1 | s='fsskryenvkm~jl{ejs}jwflzsnpgmifq{{j{|suhzrjppnx|qvixt~whu' |
得到:YLLTMFZQITRAUSDZULBUHYSELQOXRVYNDDUDCLJWEMUOOQGCNIVGKAHWJ
根据keyword+plaintext (+plaintext…+plaintext)可知该加密算法为autokey密码,是一种多表替换密码,与维吉尼亚密码密码类似。对于替换类密码的破解github上有一个项目:python_cryptanalysis
由于该项目仅支持python2,于是适当修改源码运行得到flag
解密完整代码:
1 | #main.py |
crypto2_月自圆
题目:
1 | # -*- coding:utf-8 -*- |
由题目得flag长度为71,密文为172,一位明文对应两位密文
这里由于a不大,salt长度也不长,且明文m中存在flag,正好可以用这几位去爆破出a和salt;flag在明文m中的位置是53,对应密文c中的位置是105;因此可以遍历si(26位字母)和a(50~100)
1 | from itertools import * |
通过字母f爆破的结果:
i = 52 j = D
i = 57 j = F
i = 62 j = H
i = 67 j = J
i = 72 j = L
i = 77 j = N
i = 82 j = P
i = 87 j = R
i = 92 j = T
i = 97 j = V
通过字母l爆破的结果:
i = 54 j = A
i = 55 j = U
i = 61 j = M
i = 67 j = E
i = 68 j = Y
i = 74 j = Q
i = 80 j = I
i = 86 j = A
i = 87 j = U
i = 93 j = M
i = 99 j = E
取两者的交集:a = 67
再利用a爆破salt的另外两位:
1 | if decrypt('a', 67, si)=='56': |
得到构成salt的字符为“J、E、S、Q”,又f字母是第53个,前边共52个字母是4的倍数,于是可以确定salt就为“JESQ”
解密exp:
1 | from itertools import * |
now_is_7fad9fcb-d361-4964-821c-177c906b8d20_flag_is_flag{md5(now-salt)}
最后把now(7fad9fcb-d361-4964-821c-177c906b8d20)和salt拼接起来进行md5加密就得到flag{}里面包裹的内容。
crypto3_多少离怀
题目:
1 | # -*- coding:utf-8 -*- |
hint给了要用到威尔逊定理,于是复习了一下:
在初等数论中,威尔逊定理给出了判定一个自然数是否素数的充分必要条件。即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p )
推导过程:
exp:
1 | from math import gamma |