这种做法应该算是:选择密钥攻击

http://mslc.ctf.su/wp/boston-key-party-ctf-2016-hmac-crc-crypto-5pts/

HMACCRC(m,k)=(qm(x)rm(x)k(x))modP(x),

根据这个式子,当m不变时,qm(x)rm(x)不变

k(x)=0,则有:HMACCRC(m,0) = (qm(x))modP(x),

k(x)=1,则有:HMACCRC(m,1) = (qm(x)rm(x))modP(x),

两式异或得到:

HMACCRC(m,0) HMACCRC(m,1) = rm(x) modP(x)

HMACCRC(m,0) HMACCRC(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

另外一种写法好像也是这个意思:

https://github.com/sonickun/ctf-crypto-writeups/blob/master/2016/boston-key-party/hmac_crc/solver.sage.py

第一行代码多了个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