解密Macsec帧的python (AES-GCM)

问题描述 投票:1回答:1

我是法国学生,在一次练习中,教授让我用python解密一个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)

你能帮帮我吗?

python encryption aes aes-gcm
1个回答
1
投票

这个任务主要是要从帧中识别出AES-GCM所需的组件,即nonce、AAD和tag。

帧的开始是MAC DA(目标地址)和MAC SA(源地址),每个都是6个字节长。然后是16个字节长的SecTAG(安全TAG),它是由2个字节长的MACsec以太类型(0x88e5)、1个字节长的TCIAN(TAG控制信息关联号)、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 nonce对应于SCI和PN的顺序。GCM AAD是MAC DA、MAC SA和SecTAG(以太类型、TCIAN、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

更多的细节可以找到 此处 (测试向量,确定全球协调机制的组成部分)和: 此处 (SecTAG的结构)。

© www.soinside.com 2019 - 2024. All rights reserved.