跳到主要内容

7.1.3. DeriveKeyPair (派生密钥对)

7.1.3. DeriveKeyPair (派生密钥对)

DeriveKeyPair() 生成的密钥仅具有与提供的输入密钥材料一样多的熵。对于给定的 KEM, 提供给 DeriveKeyPair() 的 ikm 参数应该至少具有 Nsk 长度, 并且应该至少具有 Nsk 字节的熵。

任何 DHKEM 的 DeriveKeyPair() 函数中的所有 KDF 函数调用 (如 LabeledExtract 或 LabeledExpand) 都使用 DHKEM 的关联 KDF (而不是密码套件的 KDF)。

对于 P-256, P-384 和 P-521, KEM 的 DeriveKeyPair() 函数对域元素执行拒绝采样:

def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = 0
counter = 0
while sk == 0 or sk >= order:
if counter > 255:
raise DeriveKeyPairError
bytes = LabeledExpand(dkp_prk, "candidate",
I2OSP(counter, 1), Nsk)
bytes[0] = bytes[0] & bitmask
sk = OS2IP(bytes)
counter = counter + 1
return (sk, pk(sk))

order 是所使用曲线的阶数 (参见 [NISTCurves] 的第 D.1.2 节), 为完整起见在下面列出。

P-256:

0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551

P-384:

0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf
581a0db248b0a77aecec196accc52973

P-521:

0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409

bitmask 对于 P-256 和 P-384 定义为 0xFF, 对于 P-521 定义为 0x01。DeriveKeyPair() 因 DeriveKeyPairError 失败的确切可能性取决于所使用的群, 但在所有情况下都可以忽略不计。有关处理此类失败的信息, 请参阅第 8.2 节。

对于 X25519 和 X448, DeriveKeyPair() 函数对输入应用 KDF:

def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = LabeledExpand(dkp_prk, "sk", "", Nsk)
return (sk, pk(sk))