这种做法应该算是:选择密钥攻击
http://mslc.ctf.su/wp/boston-key-party-ctf-2016-hmac-crc-crypto-5pts/
HMAC–CRC(m,k)=(qm(x)⊕rm(x)k(x))modP(x),
根据这个式子,当m不变时,qm(x)和rm(x)不变
令k(x)=0,则有:HMAC–CRC(m,0) = (qm(x))modP(x),
令k(x)=1,则有:HMAC–CRC(m,1) = (qm(x)⊕rm(x))modP(x),
两式异或得到:
HMAC–CRC(m,0)⊕ HMAC–CRC(m,1) = rm(x) modP(x)
HMAC–CRC(m,0)⊕ HMAC–CRC(m,k) = rm(x)k(x) modP(x)
所以,当明文m密文hmac已知,把k=0代入,即key.txt中写入0,得到hmac0;k=1代入,得到hmac1
有了这四个值,求得密钥K,得到K之后放入key.txt,正向跑题目中代码即可得到flag
代码链接里有,也就不贴了
# obtain from running hmac-task on m = "zupe secret"
hmac0 = 0xef6bbf832c7eced2
hmac1 = 0xf39e6a4125801b84
另外一种写法好像也是这个意思:
第一行代码多了个import,删掉就行,安装好sage就能跑
http://andrewl.dreamhosters.com/lblog/2016-03-06_bostonkeyparty_hmac_crc_writeup/writeup.html
这个手动过程很详细
CRC:在有限域的多项式上处理输入数据,在一个不可约多项式上求除法的余数的加密方式
https://github.com/DeliciousHorse/2016.03.BostonKeyParty/blob/master/hmac_crc.md