ESP报文的结构

Untitled

可以看到ESP报文除去原始Payload Data外,由SPI、Sequence Number、IV、Padding、Pad Length、Next Header和Authentication Data 7个部分组成。每部分的作用这里不再赘述(参考RFC4303)。

            -----------------------------------------------------------
      IPv4  | new IP hdr* |     | orig IP hdr*  |   |    | ESP   | ESP|
            |(any options)| ESP | (any options) |TCP|Data|Trailer| ICV|
            -----------------------------------------------------------
                                |<--------- encryption --------->|
                          |<------------- integrity ------------>|

长度不会变化的字段

参考RFC4303,我们可以看到ESP报文的封装格式,除去原始Payload Data,其中有哪些长度不会变化的字段呢?

  1. Security Parameters Index (SPI) ,长度为32 bit,即4 Bytes
  2. Sequence Number,长度为32 bit,即4 Bytes
  3. Pad Length,长度为8 bit,即1 Byte
  4. Next Header,长度为8 bit,即1 Byte

总计10 Bytes

长度根据加密/验证算法变化的字段

  1. Initialization Vector (IV),CBC模式加密算法的作法是对第一块明文投入随机的初始向量(IV),然后将明文与向量运算(比如与或运算)的结果加密,加密的结果再作为下一块明文的向量。这种做法的最终目的是要达到语义上的安全,让攻击者无法从密文中获取能助其破译的相关线索,避免遭受选择明文攻击法(即相同的明文加密结果一致)。在CBC算法中,IV长度根据加密块大小变化。经过对每个算法的实验抓包,Initialization Vector (IV)的长度参考如下,(参考RFC3826RFC4772RFC4106):

    Encryption Algorithm IV Length
    AES-128/AES-192/AES-256 (CBC) 16 Bytes (128 bit)
    DES/3DES (CBC) 8 Bytes (64 bit)
    AES-GCM 8 Bytes (64 bit)

    展开查看IV字段截图:

  2. Authentication Data(或称为ICV,Integrity Check Value),长度根据验证算法变化,经过对每个算法的实验抓包,Authentication Data的长度参考如下:

    Authentication Algorithm Authentication Data Length
    MD5/SHA-1 12 Bytes (96 bit)
    SHA-256 16 Bytes (128 bit)
    SHA-384 24 Bytes (192 bit)
    SHA-512 32 Bytes (256 bit)

    展开查看Authentication Data(或称为ICV,Integrity Check Value)字段截图:

算法固定,长度仍然可变的字段

Padding。

  1. 首先我们来简单了解下Padding字段的作用。为对称密钥加密设计的块密码工作模式要求需要加密的明文长度(也就是ESP报文的结构中,IV + Payload Data + Padding + Pad Length + Next Header的长度)必须是块长度的整数倍,事实是无法保证最后一个块的大小正好为块长度要求,因此信息必须填充至满足要求。只要是使用对称密钥的块密码工作模式,均可能需要Padding字段进行填充,如AES-CBC、DES/3DES-CBC(AES-GCM由于使用的是并行加密方式,不需要Padding填充)。

  2. 每种CBC加密算法的块大小总结如下,可以看到块大小和IV长度是一致的(原因请参考这里):

    Encryption Algorithm Block Size
    AES-128/AES-192/AES-256 (CBC) 16 Bytes (128 bit)
    DES/3DES (CBC) 8 Bytes (64 bit)