这次考核赛出了五道密码题,两道简单题,一道普通题,两道较难题。简单题涉及简单的异或和古典密码学。其他题涉及rsa和rabin。

本以为大部分人能做出前两道,小部分人能做出普通题,结果是我高估了……

XOR

1
2
3
4
5
6
key1 = 0x3be6cd2ff54934ab3acbad6677704ece604ca57f5c98b80c2202f5e7895c038
key1 ^ key3 = 1792894830623526767658686908642779263785886673617519881254203892028796793629
key2 ^ key3 ^ key5 = 950033597096568710981958085023083903584717513620385259720309629983423482853
key1 ^ key4 ^ key5 = 1243102356787322149585499391965376177676119626759063906817446187053371617248
key3 ^ key4 = 1676422396403372012470556853287229892420828589180623048247145822049096926016
bytes_to_long(flag) ^ key1 ^ key2 ^ key3 ^ key4 ^ key5 = 97893970896357950204263571625126419600671201901260042620774641958520051424602594839695

题目如上:

本以为大家都能很快做出来,结果稍微观察了一下大家做的情况,不少人可能连异或是什么都不知道…(是我上课没讲清楚吗)

异或的自反性: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import *
import gmpy2
import random

flag = '***********'
m = bytes_to_long(flag)
p = getPrime(300)
q = getPrime(256)
e = 65537

n = p * q
k = (p / q << 4) ^ (p % q)
t = pow(p % q, 2, n)

print 'n =', n
print 'k =', k
print 't =', t
print 'c =', pow(m, e, n)

#n = 147231302153386634373396456720813859031190823161746206555009191547832665638623974710465538880756506884363717596322750468034749563539066865009573906723202916012593814697
#k = 45596929166283091409255483034204979308207928236673434666265285913752748955618
#t = 2079079949395037653426730894161512648667027809569539205869414119080069472652623944242185693009284761642420290027745195002741711729185197075649983802328900
#c = 19136132078708250158477627474529259975621039185923401917764723143557907922483560877864236515203764570903020129515670659914164443876339914215177922049328868285537474475

这题没有人做出来,但还是稍微讲一下。

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学习一定要有耐心和毅力,同时也要有自学能力。