scapy.layers.ipsec

IPsec layer

使用示例:

>>> sa = SecurityAssociation(ESP, spi=0xdeadbeef, crypt_algo='AES-CBC',
...                          crypt_key='sixteenbytes key')
>>> p = IP(src='1.1.1.1', dst='2.2.2.2')
>>> p /= TCP(sport=45012, dport=80)
>>> p /= Raw('testdata')
>>> p = IP(raw(p))
>>> p
<IP  version=4L ihl=5L tos=0x0 len=48 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x74c2 src=1.1.1.1 dst=2.2.2.2 options=[] |<TCP  sport=45012 dport=http seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0x1914 urgptr=0 options=[] |<Raw  load='testdata' |>>>  # noqa: E501
>>>
>>> e = sa.encrypt(p)
>>> e
<IP  version=4L ihl=5L tos=0x0 len=76 id=1 flags= frag=0L ttl=64 proto=esp chksum=0x747a src=1.1.1.1 dst=2.2.2.2 |<ESP  spi=0xdeadbeef seq=1 data=b'øÛ
ƒ[T«\ÒíÑåÈYÂ¥d’Á¦’ƒ1æÁ]šÖK}W‹Ffd¥B*+Þȉ¿{©' |>>  # noqa: E501
>>>
>>> d = sa.decrypt(e)
>>> d
<IP  version=4L ihl=5L tos=0x0 len=48 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x74c2 src=1.1.1.1 dst=2.2.2.2 |<TCP  sport=45012 dport=http seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0x1914 urgptr=0 options=[] |<Raw  load='testdata' |>>>  # noqa: E501
>>>
>>> d == p
True
class scapy.layers.ipsec.AH

Bases: scapy.packet.Packet

认证头

See https://tools.ietf.org/rfc/rfc4302.txt

aliastypes
fields_desc
AH场

nh

ByteEnumField

None

payloadlen

ByteField

None

reserved

ShortField

None

spi

XIntField

0

seq

IntField

0

icv

XStrLenField

None

padding

XStrLenField

None

payload_guess

可能的子层: IPIPv6

class scapy.layers.ipsec.AuthAlgo(name, mac, digestmod, icv_size, key_size=None)

Bases: object

IPsec完整性算法

check_key(key)

Check that the key length is valid.

Parameters

–字节字符串

new_mac(**kwargs)
sign(pkt, key, esn_en=False, esn=0)

使用此算法对IPsec(ESP或AH)数据包进行签名.

Parameters
  • pkt –包含有效加密的ESP或AH层的数据包

  • 密钥 –认证密钥,字节字符串

  • esn_en –扩展序列号使能,允许使用64位序列号而不是32位

  • esn –扩展序列号(32 MSB)

Returns

签名包

verify(pkt, key, esn_en=False, esn=0)

检查数据包的完整性检查值(icv)是否有效.

Parameters
  • pkt –包含有效加密的ESP或AH层的数据包

  • 密钥 –认证密钥,字节字符串

  • esn_en –扩展序列号使能,允许使用64位序列号而不是32位

  • esn –扩展序列号(32 MSB)

Raises

scapy.layers.ipsec.IPSecIntegrityError –如果完整性检查失败

class scapy.layers.ipsec.CryptAlgo(name, cipher, mode, block_size=None, iv_size=None, key_size=None, icv_size=None, salt_size=None, format_mode_iv=None)

Bases: object

IPsec加密算法

check_key(key)

检查密钥长度是否有效.

Parameters

–字节字符串

decrypt(sa, esp, key, icv_size=None, esn_en=False, esn=0)

解密ESP数据包

Parameters
  • sa –与ESP数据包关联的SecurityAssociation.

  • esp –加密的ESP数据包

  • 密钥 –用于加密的秘密密钥

  • icv_size –用于完整性检查的icv的长度

  • esn_en –扩展序列号使能,使用AEAD算法时允许使用64位序列号而不是32位

  • esn –扩展序列号(32 MSB)

Returns

使用此算法加密的有效ESP数据包

Raises

scapy.layers.ipsec.IPSecIntegrityError –如果完整性检查因AEAD算法而失败

encrypt(sa, esp, key, esn_en=False, esn=0)

加密ESP数据包

Parameters
  • sa –与ESP数据包关联的SecurityAssociation.

  • esp –具有有效填充的未加密_ESPPlain数据包

  • 密钥 –用于加密的秘密密钥

Esn_en

扩展序列号使能,使用AEAD算法时允许使用64位序列号而不是32位

Esn

扩展序列号(32 MSB)

Returns

使用此算法加密的有效ESP数据包

generate_iv()

生成随机初始化向量.

new_cipher(**kwargs)
pad(esp)

添加正确的填充量,以使要加密的数据恰好是算法块大小的倍数.

另外,请确保ESP数据包的总长度为4字节的倍数.

Parameters

esp –未加密的_ESPPlain数据包

Returns

具有有效填充的未加密_ESPPlain数据包

class scapy.layers.ipsec.ESP

Bases: scapy.packet.Packet

封装的安全有效载荷

See https://tools.ietf.org/rfc/rfc4303.txt

aliastypes
fields_desc
ESP栏位

spi

XIntField

0

seq

IntField

0

data

XStrField

None

exception scapy.layers.ipsec.IPSecIntegrityError

Bases: Exception

完整性检查失败时,将引发错误.

class scapy.layers.ipsec.SecurityAssociation(proto, spi, seq_num=1, crypt_algo=None, crypt_key=None, auth_algo=None, auth_key=None, tunnel_header=None, nat_t_header=None, esn_en=False, esn=0)

Bases: object

此类负责IPsec数据包的"加密"和"解密". #noqa:E501

SUPPORTED_PROTOS = (<class 'scapy.layers.inet.IP'>, <class 'scapy.layers.inet6.IPv6'>)
check_spi(pkt)
decrypt(pkt, verify=True, esn_en=None, esn=None)

解密(和解封装)包含ESP或AH的IP(v6)数据包.

Parameters
  • pkt –要解密的数据包

  • 验证 –如果为False,则不执行完整性检查

  • esn_en –扩展序列号使能,使用AEAD算法时允许使用64位序列号而不是32位

  • esn –扩展序列号(32 MSB)

Returns

解密/解封装的数据包

Raises

scapy.layers.ipsec.IPSecIntegrityError –如果完整性检查失败

encrypt(pkt, seq_num=None, iv=None, esn_en=None, esn=None)

根据此SecurityAssociation使用ESP或AH加密(和封装)IP(v6)数据包.

Parameters
  • pkt –要加密的数据包

  • seq_num –如果指定,则使用此序列号而不是生成的序列号

  • esn_en –扩展序列号使能,使用AEAD算法时允许使用64位序列号而不是32位

  • esn –扩展序列号(32 MSB)

  • iv –如果指定,请使用此初始化向量进行加密,而不是使用随机向量.

Returns

加密/封装的数据包

scapy.layers.ipsec.split_for_transport(orig_pkt, transport_proto)

在正确的位置拆分IP(v6)数据包以插入ESP或AH标头.

Parameters
  • orig_pkt –要拆分的数据包. 必须是IP或IPv6数据包

  • transport_proto –将在分割位置插入的IPsec协议号.

Returns

一个元组(标头,nh,有效负载),其中nh是有效负载的协议号.

scapy.layers.ipsec.zero_mutable_fields(pkt, sending=False)

使用AH时,在计算ICV之前,所有"可变"字段都必须"清零". 请参阅RFC 4302第3.3.3.1节. 处理可变字段.

Parameters
  • pkt –包含AH层的IP(v6)数据包. 注意:数据包将被修改

  • 发送 –如果为true,则不会重新排列ipv6路由标头