题目描述:公司食堂最新出了一种小吃,叫鸡藕椒盐味汉堡,售价八块钱,为了促销,上面有一个验证码,输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡,准备还原验证码,因为一个吃不饱啊
验证码如下:1100 1010 0000 ,而且打印的时候倒了一下。把答案哈希一下就可以提交了。(答案为正确值(不包括数字之间的空格)的32位md5值的小写形式) 注意:得到的 flag 请包上 flag{} 提交
从题目我们可知鸡藕椒盐==奇偶校验(想不到吧),
奇偶校验码的定义:
1.编码方式
无论数据位多少位,校验位只有一位数据位和校验位一共所含的1个数为奇数,称为奇校验数据位和校验位一共所含的1个数为偶数,称为偶校验
注:数据传输过程一般是出现一位错误,而奇偶校验码能发现奇数个错误
海明校验码可以用来修正数字上的错误,验证码有错误,那么11001010000直接md5加密肯定不对,我们用海明校验码来获得正确的验证码:
验证码一共有12位,题目给了一个提示:每个汉堡8块,也就是说,数据位为8(k),校验位为4(r),而校验位在2^n的位置,所以共有4位校验码在1,2,4,8位置,而且题目提示验证码倒了,所以我们倒着输入验证码:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | ||||
r1 | r2 | r3 | r4 |
海明校验码计算公式:
2^r≥k+r+1(k为数据位,r为校验位)
接下来我们求校验码r1r2r3r4的值:
所等于的校验位相加 | 对应校验位 | |
1 | 1 | r1 |
2 | 2 | r2 |
3 | 1+2 | r1,r2 |
4 | 4 | r3 |
5 | 4+1 | r3,r1 |
6 | 4+2 | r3,r2 |
7 | 4+2+1 | r3,r2,r1 |
8 | 8 | r4 |
9 | 8+1 | r4,r1 |
10 | 8+2 | r4,r2 |
11 | 8+3 | r4,r1,r2 |
12 | 8+4 | r4,r3 |
校验位出现在数据位汇总:
r1:3,5,7,9,11
r2:3,6,7,10,11
r3:5,6,7,12
r4:9,10,11,12
r1等校验位的计算要用到异或(⊕),异或计算就是一样的数字得0,不同的数字得1:
那么应有:r1=0⊕1⊕1⊕1=1
r2=0⊕0⊕1⊕0⊕1=0
r3=1⊕0⊕1⊕0=0
r4=0⊕0⊕1⊕1=0
明显r1出现错误,与题目所给的r1=0不符,所依通过计算比对我们可知,9的位置出现错误,应该为1(奇偶校验码嘛,奇数个错误,一般数据传输有一位错误,所以可以确定9出现错误)
最终我们可得正确的验证码:11011010000,最后放到md5里加密一下就是flag啦:
flag{d14084c7ceca6359eaac6df3c234dd3b}
俺也是小白,如果有哪里有错误欢迎大佬给俺指出来(*`▽´*)