这次考核赛出了五道密码题,两道简单题,一道普通题,两道较难题。简单题涉及简单的异或和古典密码学。其他题涉及rsa和rabin。
本以为大部分人能做出前两道,小部分人能做出普通题,结果是我高估了……
XOR
1 | key1 = 0x3be6cd2ff54934ab3acbad6677704ece604ca57f5c98b80c2202f5e7895c038 |
题目如上:
本以为大家都能很快做出来,结果稍微观察了一下大家做的情况,不少人可能连异或是什么都不知道…(是我上课没讲清楚吗)
异或的自反性:A ^ B = C;C ^ B = A
所以给出key1和key1^key3,两者异或就能得到key3;同理可以得到key4,key5,key2;从而求出flag。
(bytes_to_long是crypto库的函数)
压缩包
上一题还有十几个人做出来,这一题就两个人做出来……
第一个是md5解密再进行hex编码
第二个是base64解码
第三个是仿射密码
第四个是w型栅栏密码
(不要手算啊,网上都有在线解密的网站)
easy_rsa
1 | from Crypto.Util.number import * |
这题没有人做出来,但还是稍微讲一下。
p % q直接可用iroot开方即可得到,p / q是k与p % q异或再左移4位即可得到。
接下来其实是初中的解方程。
a * b = m
a % b = c 余 d
已知m,c,d求a,b?
此题同理。
1 | q = (-t0 + gmpy2.iroot(t0 ** 2 + 4 * k0 * n, 2)[0]) / (2 * k0) |
(t0和k0就是p % q与p / q)
之后便是rsa的常规脚本了。
rsa_random&拉宾
不打算详细讲。
rsa_random就是爆破+求公约数;拉宾是特殊情况下的rabin算法。
总结
一是可能大家对密码学方向不太感兴趣,导致没有多少题解出来。
二是上课时间短,讲课比较仓促,很多知识点没有详细讲。
三是一些同学缺少信息搜集能力,就是不擅长利用谷歌百度去搜寻想要的信息,这也是一种能力。
四是CTF学习一定要有耐心和毅力,同时也要有自学能力。