我是一名法国学生,为了练习,我的教授让我用蟒蛇解密一个macsec框架。我有钥匙,但有一个问题:ValueError: Mac检查失败。
在这里,框架:
00 0c 29 45 13 e1 00 0c 29 b0 53 b2 88 e5 2c 00 00 00 00 16 00 0c 29 b0 53 b2 00 01 64 ad 0a 24 7f 79 b4 68 2a 4b 37 6e 20 72 c5 e7 af ee 90 7f b6 8c de e7 5e 84 d1 01 9e f2 b6 a4 91 8f f3 bd 62 69 9a 44 86 ad 5a 29 08 a0 98 64 98 74 52 a1 e0 ae 89 10 55 90 a4 5e 99 99 72 d5 91 ac dc c0 c5 c2 c8 93 8f 3f 25 59 d0 9c b6 89 15 86 ae ec 93 0f ce 3b ae f5 91 94 3e 22 67 4d 73 75 39 8b 67 de
在这里,算法:
key = binascii.unhexlify('fe0969aac4e169dfc89011326418aeae')
data = binascii.unhexlify('000c29b053b2000100000016000c294513e1000c29b053b28888e52C0000000016000c29b053b2000164ad0a247f79b4682a4b376e2072c5e7afee907fb68cdee75e84d1019ef2b6a4918ff3bd62699a4486ad5a2908a09864987452a1e0ae89105590a45e999972d591acdcc0c5c2c8938f3f2559d09cb6891586aeec930fce3baef591943e22674d7375398b67de')
iv, tag = data[:24], data[-32:]
cipher = AES.new(key, AES.MODE_GCM, iv)
cipher.decrypt_and_verify(data[24:-32], tag)你能帮我一下吗?
发布于 2020-05-24 08:55:53
任务本质上是从帧中识别AES-GCM所需的组件,即nonce、AAD和tag。
该帧从MAC DA (目标地址)和MAC SA (源地址)开始,它们各有6个字节长。然后是16字节长的SecTAG (安全标签),由2字节长的MACsec以太类型(0x88e5)、1字节长的TCI/AN (标签控制信息/关联号)、1字节长的SL (加密数据的短长度)、4字节长的PN (数据包号)和8字节长的SCI (安全通道标识符)组成。然后是加密的数据,最后是16字节长的ICV (完整性检查值):
MAC DA: 0x000c294513e1
MAC SA: 0x000c29b053b2
MACsec Ether Type: 0x88e5
TCI/AN: 0x2c
SL: 0x00
PN: 0x00000016
SCI: 0x000c29b053b20001
enc. user data: 0x64ad0a247f79b4682a4b376e2072c5e7afee907fb68cdee75e84d1019ef2b6a4918ff3bd62699a4486ad5a2908a09864987452a1e0ae89105590a45e999972d591acdcc0c5c2c8938f3f2559d09cb6891586aeec930f
ICV: 0xce3baef591943e22674d7375398b67de这些部分映射到GCM组件,如下所示:12个字节GCM对应于按此顺序级联的SCI和PN。GCM依次为MAC DA、MAC SA和SecTAG (以太类型、TCI/AN、SL、PN、SCI)的级联数据。GCM标签对应于ICV:
GCM nonce: 0x000c29b053b2000100000016
GCM AAD: 0x000c294513e1000c29b053b288e52c0000000016000c29b053b20001
GCM tag: 0xce3baef591943e22674d7375398b67de因此,加密的数据可以用PyCryptodome解密,如下所示:
from Crypto.Cipher import AES
import binascii
key = binascii.unhexlify('fe0969aac4e169dfc89011326418aeae')
nonce = binascii.unhexlify('000c29b053b2000100000016')
aad = binascii.unhexlify('000c294513e1000c29b053b288e52c0000000016000c29b053b20001')
tag = binascii.unhexlify('ce3baef591943e22674d7375398b67de')
data = binascii.unhexlify('64ad0a247f79b4682a4b376e2072c5e7afee907fb68cdee75e84d1019ef2b6a4918ff3bd62699a4486ad5a2908a09864987452a1e0ae89105590a45e999972d591acdcc0c5c2c8938f3f2559d09cb6891586aeec930f')
cipher = AES.new(key, AES.MODE_GCM, nonce)
cipher.update(aad)
decrypted = cipher.decrypt_and_verify(data, tag)
print(decrypted.hex())产出如下:
080045000054607040004001c6160a01000b0a0100160800b716022b0007a6c0c25e0000000012c5040000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637更多的细节可以找到这里 (测试向量,标识GCM组件)和这里 (SecTAG的结构)。
https://stackoverflow.com/questions/61937514
复制相似问题