首页 > 解决方案 > 有没有办法在使用 scapy(python) 时找到 AES-GCM 的键值?

问题描述

当我使用 scapy 创建 sa(ipsec) 时,我收到“ValueError: Invalid key size (96) for AES” 创建 sa 时接受提供的值,但在我申请加密时失败。(其他算法没有错误,如AES-CBC),scapy 支持 AES-GCM

使用的代码:

>>> sa = SecurityAssociation(ESP,spi=10,crypt_algo='AES-GCM',crypt_key=b'aaaaaaabbbbbaaaa',auth_algo='NULL',auth_key=b'NULL',tunnel_header=ip_tunnel)

>>> sa
<scapy.layers.ipsec.SecurityAssociation object at 0x7f055f6dd5b0>

>>> e = sa.encrypt(plain_txt)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/scapy/layers/ipsec.py", line 998, in encrypt
    return self._encrypt_esp(pkt, seq_num=seq_num,
  File "/usr/lib/python3/dist-packages/scapy/layers/ipsec.py", line 898, in _encrypt_esp
    esp = self.crypt_algo.encrypt(self, esp, self.crypt_key,
  File "/usr/lib/python3/dist-packages/scapy/layers/ipsec.py", line 358, in encrypt
    cipher = self.new_cipher(key, mode_iv)
  File "/usr/lib/python3/dist-packages/scapy/config.py", line 681, in func_in
    return func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/scapy/layers/ipsec.py", line 301, in new_cipher
    self.cipher(key),
  File "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/algorithms.py", line 35, in __init__
    self.key = _verify_key_size(self, key)
  File "/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/algorithms.py", line 20, in _verify_key_size
    raise ValueError("Invalid key size ({}) for {}.".format(
ValueError: Invalid key size (96) for AES.

标签: pythonscapyipsec

解决方案


虽然具有 IPsec 的 AES-GCM 的 AES 密钥可以是 128、192 或 256 位(16、24 或 32 字节),但需要将额外的 4 字节(32 位)盐值添加到每个数据包的 IV 中。因此,必须提供的密钥材料实际上是 160、224 或 288 位(20、28 或 36 字节),请参阅RFC 4106,第 8.1 节

您可以在此处的错误中看到:

 ValueError: Invalid key size (96) for AES

从您提供的 128 位密钥aaaaaaabbbbbaaaa中,内部删除了 32 位盐,因此 AES 的密钥减少到 96 位,这还不够。要解决此问题,请在您的密钥中添加四个额外的字符。


推荐阅读