我正在尝试构建一个实现 IPSec 功能的应用程序。应用程序接收加密的数据包,然后解密加密的数据包并将解密的数据包发送给其他应用程序。
我已经使用
scapy
(具有 128 个密钥的 AES-CBC 模式)发送了一个加密数据包。当应用程序收到此数据包时,需要解密 ESP 有效负载(其他标头已处理)。
加密的 ESP 有效负载(十六进制格式):
df 2d 42 15 29 ca 6c 77 9d 60 03 ef 4f 1d fa a9 44 85 39 80 b3 e1 9d d1 e9 21 ec e2 7c 9c 8c 23 14 40 6d 52 f9 40 f5 65 81 67 99 60 0c cd e2 e8
解密数据(十六进制格式):af d4 00 50 00 00 00 00 00 00 00 00 50 02 20 00 87 df 00 00 48 65 6c 6c 6f 20 57 6f 72 6c 64 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 0f 06
在这里,
af d4 00 50 00 00 00 00 00 00 00 00 50 02 20 00 87 df 00 00
,我假设这 20 个字节是 IP 标头。但这是垃圾。我无法使用这些值形成 IP 标头。
48 65 6c 6c 6f 20 57 6f 72 6c 64
表示 Hello World
(解密的 ESP 有效负载)
01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 0f 06
是填充。
我的命令:
echo <encrypted-esp-payload> | xxd -r -p | openssl aes-128-cbc -d -K <key> -iv <iv> -nopad | xxd -p
我的要求: 解密后我需要正确的 IPv4 标头值,以便我可以形成数据包。
我应该在命令中采取哪些不同的操作才能获取正确的 IPv4 标头值?
Openssl版本:3.0.2 IV和密钥长度:16字节 xxd:制作十六进制转储或执行相反的操作。
Scapy
命令:
sa = SecurityAssociation(ESP, spi=<spi>, crypt_algo='AES-CBC', crypt_key=b'<crypt_key>')
p = IP(src='1.1.1.1', dst='2.2.2.2')/TCP(sport=45012, dport=80)/Raw('Hello World')
p = IP(raw(p))
e = sa.encrypt(p, iv=b'<iv>')
sendp(Ether(src='00:11:22:33:44:55', dst='00:00:00:00:00:05')/e, iface="veth0")
数据包数据:
11:34:15.121850 IP 1.1.1.1 > 2.2.2.2: ESP(spi=0xdeadbeef,seq=0x1), length 72
0x0000: 4500 005c 0001 0000 4032 746a 0101 0101 E..\....@2tj....
0x0010: 0202 0202 dead beef 0000 0001 6669 7865 ............fixe
0x0020: 645f 6976 5f31 3662 7974 6573 df2d 4215 d_iv_16bytes.-B.
0x0030: 29ca 6c77 9d60 03ef 4f1d faa9 57cf 6e29 ).lw.`..O...W.n)
0x0040: f0ad e7f8 668f 6c66 29a3 c4fe bc3c 57eb ....f.lf)....<W.
0x0050: 2f27 f997 9f81 59ac 2cf7 277b /'....Y.,.'{
填充tunnel_header参数后工作。
sa = SecurityAssociation(ESP, spi=<spi>, crypt_algo='AES-CBC', crypt_key=b'<crypt_key>', tunnel_header=IP(proto=1, src="3.3.3.3",dst="4.4.4.4"))
p = IP(src='1.1.1.1', dst='2.2.2.2')/TCP(sport=45012, dport=80)/Raw('Hello World')
p = IP(raw(p))
e = sa.encrypt(p, iv=b'<iv>')
sendp(Ether(src='00:11:22:33:44:55', dst='00:00:00:00:00:05')/e, iface="veth0")