根据题目,查到海明校验码,也是之前没有接触到的知识,所以在这里整理以下,也供大家参考。
题目:公司食堂最新出了一种小吃,叫鸡藕椒盐味汉堡,售价八块钱,为了促销,上面有一个验证码,输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡,准备还原验证码,因为一个吃不饱啊验证码如下:1100 1010 0000 ,而且打印的时候倒了一下。把答案哈希一下就可以提交了(答案为正确值(不包括数字之间的空格)的32位md5值的小写形式)
1.分析校验位数
从题目可知验证码为110010100000共12位,校验位一般都是在2^n的位置,所以共有4位校验码在1,2,4,8位置
拓展:海明验证码公式:2^r≥k+r+1 (r为校验位 ,k为信息位),如本验证码本来有8位信息码,带入公式可得r=4,所以在1,2,4,8位置添加相应校验码
2.画表
题目中提到打印的时候倒了一下,所以将信息位倒着填入表中
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 位数 |
0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 信息位(D) | ||||
R1 | R2 | R3 | R4 | 校验位(R) |
3.求校验位的值
例如:1由第一位R1来校验;2由第二位R2来校验;由于3=1+2(1和2指的是位数,都是2的n次方)所以3由第一位R1和第二位R2校验,4由第四位R3校验,5和3道理是一样的,5=1+4(2^0+2^2);6=2+4;7=1+2+4,依次类推。得出下表:
海明码位号 | 占用的校验位号 | 校验位 |
1 | 1 | R1 |
2 | 2 | R2 |
3 | 1、2 | R1、R2 |
4 | 4 | R3 |
5 | 1、4 | R1、R3 |
6 | 2、4 | R2、R3 |
7 | 1、2、4 | R1、R2、R3 |
8 | 8 | R4 |
9 | 1、8 | R1、R4 |
10 | 2、8 | R2、R4 |
11 | 1、2、8 | R1、R2、R4 |
12 | 4、8 | R3、R4 |
进行汇总,看每个校验位都确定了哪一位。
R1:1、3、5、7、9、11
R2:2、3、6、7、10、11
R3:4、5、6、7、12
R4:9、10、11、12
最后用异或运算求出R1、R2、R3、R4、R5的值(以R1为例):
R1=D1⊕D3⊕D5⊕D7⊕D9⊕D11=1
以此类推:R1=1,R2=0,R3=0,R4=0
可以看到P1P2P3P4=0001,R1R2R3R4=1000
可以求得监督位(异或):
0 | 0 | 0 | 1 | 验证码中的校验码 |
1 | 0 | 0 | 0 | 求得的校验码 |
1 | 0 | 0 | 1 | 监督位 |
监督位不为0000,说明接收方生成的校验位和收到的校验位不同,错误的位数是监督位的十进制即9,所以把D9就是题目中提到的错误,得到正确验证码110110100000,然后根据提示MD5hash一下就出来了。
1 import hashlib 2 c="110110100000" 3 md=hashlib.md5() 4 md.update(c.encode("utf8")) 5 flag = md.hexdigest() 6 print(flag) 7 8 #d14084c7ceca6359eaac6df3c234dd3b
套入flag{}即可得到答案flag{d14084c7ceca6359eaac6df3c234dd3b}