4. Cryptographic Dependencies (密码学依赖)
4. Cryptographic Dependencies (密码学依赖)
HPKE 变体依赖于以下原语:
密钥封装机制 (KEM):
-
GenerateKeyPair(): 随机算法以生成密钥对 (skX, pkX). -
DeriveKeyPair(ikm): 确定性算法从字节字符串 ikm 派生密钥对 (skX, pkX), 其中 ikm 应该至少具有 Nsk 字节的熵 (有关讨论, 请参见第 7.1.3 节). -
SerializePublicKey(pkX): 生成长度为 Npk 的字节字符串, 对公钥 pkX 进行编码. -
DeserializePublicKey(pkXm): 解析长度为 Npk 的字节字符串以恢复公钥.此函数可在 pkXm 反序列化失败时引发DeserializeError错误. -
Encap(pkR): 随机算法以生成临时固定长度对称密钥 (KEM 共享密钥) 和该密钥的固定长度封装, 该封装可由与 pkR 对应的私钥持有者解封装.此函数可在封装失败时引发EncapError. -
Decap(enc, skR): 使用私钥 skR 从其封装表示 enc 恢复临时对称密钥 (KEM 共享密钥) 的确定性算法.此函数可在解封装失败时引发DecapError. -
AuthEncap(pkR, skS)(可选): 与Encap()相同, 并且输出编码了 KEM 共享密钥是由私钥 skS 持有者生成的保证. -
AuthDecap(enc, skR, pkS)(可选): 与Decap()相同, 并且接收者确信 KEM 共享密钥是由私钥 skS 持有者生成的. -
Nsecret: 此 KEM 产生的 KEM 共享密钥的字节长度. -
Nenc: 此 KEM 产生的封装密钥的字节长度. -
Npk: 此 KEM 的编码公钥的字节长度. -
Nsk: 此 KEM 的编码私钥的字节长度.
密钥派生函数 (KDF):
-
Extract(salt, ikm): 从输入密钥材料 ikm 和可选字节字符串 salt 中提取固定长度 Nh 字节的伪随机密钥. -
Expand(prk, info, L): 使用可选字符串 info 将伪随机密钥 prk 扩展为 L 字节的输出密钥材料. -
Nh:Extract()函数的输出大小 (字节).
AEAD 加密算法 [RFC5116]:
-
Seal(key, nonce, aad, pt): 使用对称密钥 key 和随机数 nonce 加密和认证明文 pt 与关联数据 aad, 产生密文和标签 ct.此函数可在失败时引发MessageLimitReachedError. -
Open(key, nonce, aad, ct): 使用对称密钥 key 和随机数 nonce 解密密文和标签 ct 与关联数据 aad, 返回明文消息 pt.此函数可在失败时引发OpenError或MessageLimitReachedError. -
Nk: 此算法的密钥的字节长度. -
Nn: 此算法的随机数的字节长度. -
Nt: 此算法的认证标签的字节长度.
除上述之外, KEM 还可以公开以下函数, 其行为在第 7.1.2 节中详细说明:
-
SerializePrivateKey(skX): 生成长度为 Nsk 的字节字符串, 对私钥 skX 进行编码. -
DeserializePrivateKey(skXm): 解析长度为 Nsk 的字节字符串以恢复私钥.此函数可在 skXm 反序列化失败时引发DeserializeError错误.
密码套件 (ciphersuite) 是包含每个原语的算法选择的三元组 (KEM, KDF, AEAD).
第 7 节提供了这些原语具体实例化的算法标识符集.算法标识符值长度为两个字节.
请注意, GenerateKeyPair 可以实现为 DeriveKeyPair(random(Nsk)).
符号 pk(skX) 取决于其使用以及 KEM 及其实现, 要么是使用私钥计算公钥, 要么只是表达公钥检索的语法, 假设它与私钥对象一起存储.
定义以下两个函数以促进 KDF 调用的域分离以及上下文绑定:
def LabeledExtract(salt, label, ikm):
labeled_ikm = concat("HPKE-v1", suite_id, label, ikm)
return Extract(salt, labeled_ikm)
def LabeledExpand(prk, label, info, L):
labeled_info = concat(I2OSP(L, 2), "HPKE-v1", suite_id,
label, info)
return Expand(prk, labeled_info, L)
suite_id 的值取决于使用 KDF 的位置; 假设它从实现中隐式获得, 而不作为参数传递.如果在 KEM 算法内部使用, suite_id 必须以 "KEM" 开头并标识此 KEM 算法; 如果在 HPKE 的其余部分使用, 它必须以 "HPKE" 开头并标识正在使用的整个密码套件.有关详细信息, 请参见第 4.1 节和第 5.1 节.