混合加密

混合加密原语将对称加密的效率与公钥(非对称)加密的便利性结合在一起。任何人都可以使用公钥加密数据,但只有拥有私钥的用户才能解密数据。

对于混合加密,发送者生成一个新的对称密钥来加密每条消息的明文,从而生成密文。该对称密钥与接收方的公钥一起封装。对于混合解密,对称密钥将由接收方进行解封,然后用于解密密文以恢复原始明文。如需详细了解如何存储或传输密文以及密钥封装,请参阅 Tink 混合加密传输格式

混合加密具有以下属性:

  • 保密:除非有权访问私钥,否则任何人都无法获得有关加密明文的任何信息(长度除外)。
  • 不对称性:可以使用公钥对密文进行加密,但在解密时,必须使用私钥。
  • 随机:加密是随机的。明文相同的两条消息不会产生相同的密文。这样可防止攻击者知道哪个密文与给定的明文对应。

混合加密在 Tink 中表示为一对基元:

  • 使用 HybridEncrypt 进行加密
  • HybridDecrypt 进行解密

上下文信息参数

除了明文之外,混合加密还接受一个额外参数 context_info,该参数通常是从上下文隐式的公开数据,但应该绑定到生成的密文。这意味着密文允许您确认上下文信息的完整性,但不保证其机密性或真实性。实际的上下文信息可以为空或 null,但为了确保能够正确解密生成的密文,必须提供相同的上下文信息值进行解密。

混合加密的具体实现可以通过各种方式将上下文信息绑定到密文,例如:

  • 使用 context_info 作为 AEAD 对称加密的关联数据输入(请参阅 RFC 5116)。
  • 使用 context_info 作为 HKDF 的“CtxInfo”输入(如果实现使用 HKDF 作为密钥派生函数,请参阅 RFC 5869)。

选择密钥类型

对于大多数使用场景,我们建议使用 DHKEM_X25519_HKDF_SHA256_HKDF_SHA256_AES_256_GCM 密钥类型。此密钥类型实现了 RFC 9180 中指定的混合公钥加密 (HPKE) 标准。HPKE 由密钥封装机制 (KEM)、密钥派生函数 (KDF) 和基于关联数据的经身份验证加密 (AEAD) 算法组成。

DHKEM_X25519_HKDF_SHA256_HKDF_SHA256_AES_256_GCM具体采用以下员工:

  • KEM:使用 HKDF-SHA-256 通过 Diffie–Hellman 通过 Curve25519 推导共享密钥。
  • KDF:HKDF-SHA-256,用于推导发送者和接收者上下文。
  • AEAD:采用 HPKE 标准生成的 AES-256-GCM,包含 12 字节的 Nonce。

其他受支持的 HPKE 密钥类型包括但不限于:

  • DHKEM_X25519_HKDF_SHA256_HKDF_SHA256_AES_128_GCM
  • DHKEM_X25519_HKDF_SHA256_HKDF_SHA256_CHACHA20_POLY1305
  • DHKEM_P256_HKDF_SHA256_HKDF_SHA256_AES_128_GCM
  • DHKEM_P521_HKDF_SHA512_HKDF_SHA512_AES_256_GCM

如需详细了解 KEM、KDF 和 AEAD 的算法选择,请参阅 RFC 9180

Victor Shoup 的 ISO 18033-2 标准中所述,虽然已不再推荐使用,但 Tink 还支持 ECIES 的某些变体。下面列出了一些受支持的 ECIES 密钥类型:

  • ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM
  • ECIES_P256_COMPRESSED_HKDF_HMAC_SHA256_AES128_GCM
  • ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256
  • ECIES_P256_COMPRESSED_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256

基本属性

  • 明文和上下文信息可以具有任意长度(在 0..232 字节范围内)
  • 防范自适应选择的密文攻击
  • 针对基于椭圆曲线的方案的 128 位安全性

用例示例

请参阅“我要交换数据”。