用于封装安全载荷 (ESP) 中的基于计数器的密码的隐式初始化向量 (IV)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本文档是 Internet 工程任务组 (IETF) 的产品。它代表了 IETF 社区的共识。它已接受公众审查,并已被互联网工程指导小组 (IESG) 批准出版。有关 Internet 标准的更多信息,请参见 RFC 7841 的第 2 节。

640.gif


RFC8750:Implicit Initialization Vector (IV) for Counter-Based Ciphers in Encapsulating Security Payload (ESP),March 2020


梗概


封装安全载荷 (Encapsulating Security Payload,ESP) 在每个数据包中发送一个初始化向量 (initialization vector,IV)。IV 的大小取决于应用的变换,对于编写本文档时定义的变换,通常为 8 或 16 个八位字节。与 IPsec 一起使用时,一些算法,例如 AES-GCM、AES-CCM 和 ChaCha20-Poly1305,采用 IV 生成一个随机数,用作加密和解密的输入参数。这个 IV 必须是唯一的,但可以预测。因此,可以使用 ESP 序列号 (Sequence Number,SN) 中提供的值来生成随机数。在 AES-GCM、AES-CCM 和 ChaCha20-Poly1305 的情况下,这避免了发送 IV 本身并为每个数据包节省 8 个八位字节。本文档介绍了如何执行此操作。


本备忘录的状态


这是一个 Internet 标准跟踪文档。


本文档是 Internet 工程任务组 (IETF) 的产品。它代表了 IETF 社区的共识。它已接受公众审查,并已被互联网工程指导小组 (IESG) 批准出版。有关 Internet 标准的更多信息,请参见 RFC 7841 的第 2 节。


有关本文档当前状态、任何勘误以及如何提供反馈的信息,请访问 https://www.rfc-editor.org/info/rfc8750


版权声明


版权所有 (c) 2020 IETF Trust 和确定为文档作者的人员。版权所有。


本文档受 BCP 78 和 IETF 信托与 IETF 文档相关的法律规定 (https://trustee.ietf.org/license-info) 的约束,该条款自本文档发布之日起生效。请仔细阅读这些文件,因为它们描述了您对本文件的权利和限制。从本文档中提取的代码组件必须包含 Trust Legal Provisions 第 4.e 节中所述的简化 BSD 许可文本,并且不提供如简化 BSD 许可中所述的保证。


1、 介绍


基于计数器的 AES 操作模式,例如 AES-CCM [RFC4309] 和 AES-GCM [RFC4106],需要为每个 ESP 数据包指定一个随机数。这同样适用于 ChaCha20-Poly1305 [RFC7634]。目前,由于每个 ESP 数据包 [RFC4303] 中提供的初始化向量 (IV),生成此随机数。这种做法在本文件中被指定为“显式 IV”。


在某些情况下,例如物联网 (Internet of Things,IoT),最好避免携带与 IV 关联的额外字节,而是在每个对等体本地生成它。IV 的本地生成在本文档中被指定为“隐式 IV”。


这个 IV 的大小取决于具体的算法,但上面提到的所有算法都采用 8 个八位字节的 IV。


本文档定义了在隐式时如何在本地计算 IV。它还指定了对等方如何同意 Internet 密钥交换版本 2 (IKEv2) [RFC7296] 关于使用隐式 IV 与显式 IV。


本文档将其范围限制为上述算法。其他具有类似属性的算法可能会在以后定义为使用类似的机制。


本文档不考虑 AES-CBC [RFC3602],因为 AES-CBC 要求 IV 不可预测。如下所述直接从数据包计数器中获取它是不安全的,如 [RFC3602] 的第 6 节所述,并导致了现实世界中选择的明文攻击,例如 BEAST [BEAST]。


本文档不考虑 AES-CTR [RFC3686],因为它侧重于 [RFC8221] 中提供的推荐的带有关联数据的身份验证加密 (Authenticated Encryption with Associated Data,AEAD) 套件。


2、 需求符号


关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“NOT RECOMMENDED”、“MAY”和“OPTIONAL” 当且仅当它们以所有大写字母出现时,本文档中的内容将按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,如此处所示。


3、 术语


IoT:Internet of Things,物联网


IV:Initialization Vector,初始化向量


IIV:Implicit Initialization Vector,隐式初始化向量


Nonce:固定大小的八位字节字符串,只使用一次。在本文档中,IV 用于生成加密/解密的随机数输入。


4、 隐式 IV


对于第 1 节中列出的算法,对于给定的密钥,8 字节的 IV 不得重复。ESP 数据包与其 IV 之间的绑定是使用序列号或扩展序列号提供的。图 1 和图 2 分别表示具有常规 4 字节序列号和 8 字节扩展序列号的 IV。


640.png

图 1:具有 4 字节序列号的隐式 IV


Sequence Number:序列号,ESP 数据包中携带的 4 字节序列号。


Zero:零,所有位都设置为零的 4 字节数组。


640.png

图 2:具有 8 字节扩展序列号的隐式 IV


Extended Sequence Number:扩展序列号,安全联盟的 8 字节扩展序列号。ESP 数据包中携带四个低位字节。


本文档仅定义了 AES-GCM 的[RFC4106]、AES-CCM 的[RFC4309]和ChaCha20-Poly1305 的[RFC7634]中定义的算法的IV 生成。这些算法的所有其他方面和参数都保持不变,并按照各自规范中的定义使用。


5、 IKEv2 发起者行为


支持此功能的发起者应该在 IKEv2 交换中的安全联盟 (Security Association,SA) 载荷内的提议子结构的转换类型 1(加密算法)子结构中提议隐式 IV(IIV)算法。为了促进与非支持对等体的向后兼容性,发起者还应该包括那些具有显式 IV 的相同算法作为单独的转换。


6、 IKEv2 响应者行为


SA 载荷处理的规则要求响应者从发起者发送的提议中选择其算法,从而确保响应者永远不会将包含 IIV 变换的 SA 载荷发送给未提出它的发起者。


7、 安全考虑


这些算法的随机数生成尚未明确定义。只要满足某些安全要求,它就留给了实现。通常,对于 AES-GCM、AES-CCM 和 ChaCha20-Poly1305,不允许对一个特定密钥重复 IV。本文档提供了一种明确且规范的方式来生成 IV。本文档中描述的机制满足所有相关算法的 IV 安全要求。


由于当使用计数器模式密码时,IV 不得为一个 SA 重复,因此本文档中描述的隐式 IV 不得用于设置中,序列号可能与一个 SA 重叠。对于不使用扩展序列号的 SA,在传输第 2^32 个数据包之前,以及在传输使用扩展序列号的 SA 的第 2^64 个数据包。这可以防止普通点对点情况下的序列号重叠。[RFC5374]、[RFC6407] 和 [G-IKEv2] 中描述的组播是一个突出的例子,其中许多发送者共享一个密钥,因此共享一个 SA。因此,如果采用了一些机制来防止序列号对于一个 SA 重叠,则隐式 IV 只能与组播一起使用;否则,隐式 IV 不得与组播一起使用。


本文档定义了三个使用隐式 IV 的新加密转换。与迄今为止定义的大多数加密转换(可同时用于 ESP 和 IKEv2)不同,这些转换仅针对 ESP 定义,不能在 IKEv2 中使用。原因是 IKEv2 消息不包含可用于 IV 生成的每个消息的唯一值。IKEv2 头中的 Message-ID 字段类似于 ESP 头中的 SN 字段,但最近的 IKEv2 扩展 [RFC6311] [RFC7383] 确实允许它重复,因此没有一种简单的方法可以从 IKEv2 头中导出唯一的 IV领域。


8、 IANA 考虑


IANA 已更新“互联网密钥交换版本 2 (Internet Key Exchange Version 2,IKEv2) 参数”注册表 [RFC7296],将以下新代码点添加到“转换类型值”注册表 [IANA] 下的“转换类型 1 - 加密算法转换 ID”子注册表中:


640.png

表 1:对“转换类型 1 - 加密算法转换 ID”注册表的添加


9、 参考文献


9.1、 规范参考


[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.
[RFC3602] Frankel, S., Glenn, R., and S. Kelly, "The AES-CBC Cipher Algorithm and Its Use with IPsec", RFC 3602, DOI 10.17487/RFC3602, September 2003, <https://www.rfc-editor.org/info/rfc3602>.
[RFC3686] Housley, R., "Using Advanced Encryption Standard (AES) Counter Mode With IPsec Encapsulating Security Payload (ESP)", RFC 3686, DOI 10.17487/RFC3686, January 2004, <https://www.rfc-editor.org/info/rfc3686>.
[RFC4106] Viega, J. and D. McGrew, "The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP)", RFC 4106, DOI 10.17487/RFC4106, June 2005, <https://www.rfc-editor.org/info/rfc4106>.
[RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", RFC 4303, DOI 10.17487/RFC4303, December 2005, <https://www.rfc-editor.org/info/rfc4303>.
[RFC4309] Housley, R., "Using Advanced Encryption Standard (AES) CCM Mode with IPsec Encapsulating Security Payload (ESP)", RFC 4309, DOI 10.17487/RFC4309, December 2005, <https://www.rfc-editor.org/info/rfc4309>.
[RFC5374] Weis, B., Gross, G., and D. Ignjatic, "Multicast Extensions to the Security Architecture for the Internet Protocol", RFC 5374, DOI 10.17487/RFC5374, November 2008, <https://www.rfc-editor.org/info/rfc5374>.
[RFC6311] Singh, R., Ed., Kalyani, G., Nir, Y., Sheffer, Y., and D. Zhang, "Protocol Support for High Availability of IKEv2/IPsec", RFC 6311, DOI 10.17487/RFC6311, July 2011, <https://www.rfc-editor.org/info/rfc6311>.
[RFC6407] Weis, B., Rowles, S., and T. Hardjono, "The Group Domain of Interpretation", RFC 6407, DOI 10.17487/RFC6407, October 2011, <https://www.rfc-editor.org/info/rfc6407>.
[RFC7296] Kaufman, C., Hoffman, P., Nir, Y., Eronen, P., and T. Kivinen, "Internet Key Exchange Protocol Version 2 (IKEv2)", STD 79, RFC 7296, DOI 10.17487/RFC7296, October 2014, <https://www.rfc-editor.org/info/rfc7296>.
[RFC7383] Smyslov, V., "Internet Key Exchange Protocol Version 2 (IKEv2) Message Fragmentation", RFC 7383, DOI 10.17487/RFC7383, November 2014, <https://www.rfc-editor.org/info/rfc7383>.
[RFC7634] Nir, Y., "ChaCha20, Poly1305, and Their Use in the Internet Key Exchange Protocol (IKE) and IPsec", RFC 7634, DOI 10.17487/RFC7634, August 2015, <https://www.rfc-editor.org/info/rfc7634>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8221] Wouters, P., Migault, D., Mattsson, J., Nir, Y., and T. Kivinen, "Cryptographic Algorithm Implementation Requirements and Usage Guidance for Encapsulating Security Payload (ESP) and Authentication Header (AH)", RFC 8221, DOI 10.17487/RFC8221, October 2017, <https://www.rfc-editor.org/info/rfc8221>.


9.2、 参考资料

[BEAST] Duong, T. and J. Rizzo, "Here Come The xor Ninjas", May 2011, <https://www.researchgate.net/publication/266529975_Here_Come_The_Ninjas>.
[G-IKEv2] Weis, B. and V. Smyslov, "Group Key Management using IKEv2", Work in Progress, Internet-Draft, draft-ietf-ipsecme-g-ikev2-00, 8 January 2020, <https://tools.ietf.org/html/draft-ietf-ipsecme-g-ikev2-00>.
[IANA] IANA, "Internet Key Exchange Version 2 (IKEv2) Parameters", <https://www.iana.org/assignments/ikev2-parameters>.


致谢


我们要感谢 Valery Smyslov、Éric Vyncke、Alexey Melnikov、Adam Roach 和 Magnus Nyström(安全局)以及我们的三个安全 AD——Eric Rescorla、Benjamin Kaduk 和 Roman Danyliw——的宝贵意见。我们还要感谢 David Schinazi 的实施以及 Tero Kivinen 和 David Waltermire(IPSECME 主席)推动这项工作

相关文章
|
1月前
|
Java 程序员 C++
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
23 0
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
|
3月前
|
Go 数据处理
深入理解函数返回多个值的机制
【8月更文挑战第31天】
11 0
|
6月前
|
存储 安全 编译器
使用unsafe库操作结构体的属性偏移和指针转换
【5月更文挑战第19天】Go语言是类型安全的,但通过`unsafe`包,可以进行结构体属性偏移量计算和指针转换。`unsafe.Offsetof`获取结构体字段的偏移量,`unsafe.Pointer`允许不同类型指针间的转换。然而,这可能导致类型安全屏障被绕过,若使用不当,会引发安全问题或panic。应谨慎使用`unsafe`,因为它不遵循GO 1兼容性准则。
51 0
使用unsafe库操作结构体的属性偏移和指针转换
|
6月前
|
存储 机器人
使用阿里云RPA变量的一些基本步
【2月更文挑战第8天】使用阿里云RPA变量的一些基本步
322 2
|
6月前
|
C语言
C语言函数传递了指针,值没有被修改的原因及解决方法
C语言函数中传递了指针作为参数,确切来说是传递了指向变量的内存地址作为参数,可经过函数内的修改之后,该指针指向的变量的值为什么不会被修改?就像下方这个函数:
109 1
|
Java 数据安全/隐私保护
java实现请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,使c1、c2、c3、c4、c5变为’G’、’l’、’m’、’r’、’e
java实现请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,使c1、c2、c3、c4、c5变为’G’、’l’、’m’、’r’、’e
|
PyTorch 算法框架/工具
如何将网络参数初始化,或者如何将网络参数还原成原始参数状态
在以上代码中,_initialize_weights()方法用于对网络参数进行初始化。其中,init.ones_表示将权重初始化为1,init.zeros_表示将偏置初始化为0。 3. 如果想将网络参数恢复到初始状态,则可以重新调用_initialize_weights()方法
310 0
|
算法 Java Spring
自定义全局自增ID生成器(上)
自定义全局自增ID生成器
202 0
|
NoSQL Redis
自定义全局自增ID生成器(下)
自定义全局自增ID生成器
237 0
|
数据安全/隐私保护 开发者
加密服务原始初始化|学习笔记
快速学习加密服务原始初始化
170 0