BUUCTF 鸡藕椒盐味 wp 海明校验码

根据题目,查到海明校验码,也是之前没有接触到的知识,所以在这里整理以下,也供大家参考。

题目:公司食堂最新出了一种小吃,叫鸡藕椒盐味汉堡,售价八块钱,为了促销,上面有一个验证码,输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡,准备还原验证码,因为一个吃不饱啊验证码如下: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.画表

题目中提到打印的时候倒了一下,所以将信息位倒着填入表中

123456789101112位数
00100011信息位(D)
R1R2R3R4校验位(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,依次类推。得出下表:

海明码位号占用的校验位号校验位
11R1
22R2
31、2R1、R2
44R3
51、4R1、R3
62、4R2、R3
71、2、4R1、R2、R3
88R4
91、8R1、R4
102、8R2、R4
111、2、8R1、R2、R4
124、8R3、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

可以求得监督位(异或):

0001验证码中的校验码
1000求得的校验码
1001监督位

监督位不为0000,说明接收方生成的校验位和收到的校验位不同,错误的位数是监督位的十进制即9,所以把D9就是题目中提到的错误,得到正确验证码110110100000,然后根据提示MD5hash一下就出来了。

import hashlib
c="110110100000"
md=hashlib.md5()
md.update(c.encode("utf8"))
flag = md.hexdigest()
print(flag)                   
#d14084c7ceca6359eaac6df3c234dd3b

套入flag{}即可得到答案flag{d14084c7ceca6359eaac6df3c234dd3b}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuh1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值