1 min read
关于CBC-MAC长度扩展一小题复现
题出自2023熵密杯初始谜题,不是很难,但是还是思考了好一会,还是理解不够深
ctf crypto writeup wp 熵密杯
题目
-----------------------------------------------------
MSG1:
e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2
MAC1:
0712c867aa6ec7c1bb2b66312367b2c8
-----------------------------------------------------
MSG2:
d8d94f33797e1f41cab9217793b2d0f02b93d46c2ead104dce4bfec453767719
MAC2:
43669127ae268092c056fd8d03b38b5b
-----------------------------------------------------
请输入您的MSG3(64字节,128个Hex,不要添加空格!)(Please input your 64bytes MSG3(64 bytes,128 hexs,don't using space)):
请输入您的MAC3(Please input your MAC3):
有两组消息和对应 MAC(共两块,每块 16 bytes):
MSG1:
e55e3e24a3ae7797808fdca05a16ac15 //p1
eb5fa2e6185c23a814a35ba32b4637c2 //p2
MAC1:
0712c867aa6ec7c1bb2b66312367b2c8 //C2
MSG2:
d8d94f33797e1f41cab9217793b2d0f0 //p3
2b93d46c2ead104dce4bfec453767719 //p4
MAC2:
43669127ae268092c056fd8d03b38b5b //D2
CBC-MAC: 初始 IV = 0 每块:
C1 = E(P1 xor IV)
C2 = E(P2 xor C1)
...
Cn = E(Pn xor C(n-1))
MAC = Cn
最后一块密文作为 MAC。 这里只有两块所以C2就是密文。我们知道这个IV固定就是0了,那么我们C1就会变成E(p1),第二段密文同理。 我们的目标构造一个新的消息 MSG3,同时知道所对应的最后一块密文,但是我们不知道加密的流程,所以MAC肯定是要从上面选一个用。
首先他说要64个字节,那么我们能直接想到就是直接把两个msg拼接在一起
MSG3=p1|p2|p3|p4
前两块结束后状态:
C2=MAC1
于是第三块加密时实际输入CBC 会先异或上一块输出:
第三块输入:p3 xor MAC1
所以:
C3=E(p3 xor MAC1)
而 MSG2 中第一块是:
D1=E(p3)
两者不同。因此最终 MAC 不会等于 MAC2。 那么我们要想办法如何消掉这个 MAC1,使得希望第三块真正送入 AES 的数据仍然是p3
那么我们知道了p3’=p3 xor MAC1的,那么我们再xor一个MAC1,就是p3’=p3 xor MAC1 xor MAC1那么就变成了p3’=p3,成功抵消,那么最后一块就成功变成了MAC2。 实际操作算一下
from Crypto.Util.strxor import strxor
p3 = bytes.fromhex("d8d94f33797e1f41cab9217793b2d0f0")
mac1 = bytes.fromhex("0712c867aa6ec7c1bb2b66312367b2c8")
print((strxor(p3,mac1)).hex())
#dfcb8754d310d88071924746b0d56238
那么最后答案就是
MSG3:
e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2dfcb8754d310d88071924746b0d562382b93d46c2ead104dce4bfec453767719
MAC3:
43669127ae268092c056fd8d03b38b5b