全国大学生信息安全竞赛初赛_对称密码1

这次比赛我一共做了3题,一题就是之前写的珍贵资料

一题是这个密码学的

还有题是摩斯电码+栅栏加密,这题太简单就不写了

这题是对称密码1

对称密码1

题目链接:http://www.ichunqiu.com/racing/54391

下载下来是一个.c的文件

编译运行可以看到以十六进制分别输出三个例子的明文、密文、恢复出来的明文

1
2
3
#define PlainLen	32
#define KeyLen 16
#define EncRound 8

以上是需要知道的信息,明文长度已知

则我们需要知道的是秘钥的长度,加密次数

注意:直接进行全局密钥空间穷举的解题方法,将被判定无效,得分在最终结果中将被扣除。

题目中包含了这个,也就不能直接爆破,其实题目里还有一句提示:

参照smaple1

所以我们看一下sample1

得到信息:1.加密次数1次 2.秘钥“Start”

所以,我刚开始的思路是秘钥为“End”、“Finish”、“Begin”

结果……显然都不对,还是太蠢了(捂脸)

好吧,在继续看,我们注意到,三个例子都是flag{XXXXXXXX}

最后我们也是要得到flag{XXXXXXXXX}

所以我们就知道了f,l,a,g,{,}对应的密文,再加上已知加密函数,我们就可以推出一部分秘钥了

1
2
3
4
5
6
7
8
9
f     l     a     g     {      XXXXXXXXXXXXXXXXXXX       }
0x66 0x6c 0x61 0x67 0x7B 0x7D
0x83 0x44 0xD1 0x66 0xA8 0x40 0x84
cipher[0] = sbox[(unsigned char) (key[0]^plain[0]^key[1])] 0x83
cipher[1] = sbox[(unsigned char) (cipher[0]^plain[1]^key[2])] 0x44
cipher[2] = sbox[(unsigned char) (cipher[1]^plain[2]^key[3])] 0xD1
cipher[3] = sbox[(unsigned char) (cipher[2]^plain[3]^key[4])] 0x66
cipher[4] = sbox[(unsigned char) (cipher[3]^plain[4]^key[5])] 0xA8
cipher[44] = sbox[(unsigned char) (cipher[43]^plain[45]^key[??])] 0x84

按照这个写出程序可得部分秘钥

并且测试出秘钥长度为6,秘钥后四位为iter,前两位不知

只有两位不知,大小写加起来52*52爆破也就2704种情况

并且筛选出解密出来第一位为f的情况,写程序破解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int main()
{

printf("---------- caculate answer ------------\n");
#define round 1
#define problemkeylen strlen(guesskey)
#define ansplainlen 45
char problem_cipher[] = {
0x83,0x44,0xD1,0x66,0xA8,0x19,0xC0,0x57,
0xFC,0xB0,0x8D,0xCD,0x4B,0x2C,0x75,0x43,
0x1A,0x7C,0xF5,0xBF,0x97,0x5C,0xA0,0xE7,
0x74,0x10,0xAD,0x7A,0xDA,0x68,0xB6,0xA9,
0x6C,0xB1,0x06,0x67,0x10,0xF0,0xF8,0x03,
0x59,0x1B,0x67,0x40,0x84};
char guesskey[] = "00iter";
char ans[50];
for(char i='A';i<='Z';i++)
{
for(int j='a';j<='z';j++)
{
guesskey[0]=i;
guesskey[1]=j;
Decrypt(problem_cipher, ansplainlen, ans, guesskey, problemkeylen, round);
if(ans[0]=='f')
{
ShowHex(ans,ansplainlen);
for(int i=0;i<ansplainlen;i++)
{
printf("%c",ans[i]);
}
printf(" %s",guesskey);
printf("\n");
}
}
}
return 0;
}

1

从结果看出来筛选出的第二个显然就是flag了

(别问我为什么( ̄ε(# ̄)☆╰╮( ̄▽ ̄///))

所以答案就是flag{Congradulations_You_made_the_first_step}

对应秘钥为Beiter (所以这是什么鬼)

不得不说,这么想出来成就感好高哈哈哈哈哈哈哈哈(此处为豪迈的笑声)

×

赞助gif换电脑、吃双皮奶(逃

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 对称密码1
    1. 1.0.0.0.1. 注意:直接进行全局密钥空间穷举的解题方法,将被判定无效,得分在最终结果中将被扣除。
  2. 1.0.0.1. 参照smaple1
,