跳到主要内容

7.2. Output from Key Exchange (密钥交换的输出)

7.2. Output from Key Exchange (密钥交换的输出)

密钥交换产生两个值: 共享密钥 K 和交换散列 H.加密和认证密钥从这些值派生.第一次密钥交换的交换散列 H 还用作会话标识符, 这是此连接的唯一标识符.它被认证方法用作签名数据的一部分, 作为私钥持有的证明.会话标识符一旦计算, 即使稍后重新交换密钥也不会改变.

每个密钥交换方法都指定在密钥交换中使用的散列函数.密钥派生中必须使用相同的散列算法.这里, 我们称之为 HASH.

加密密钥必须计算为已知值和 K 的 HASH, 如下所示:

  • 客户端到服务器的初始 IV: HASH(K || H || "A" || session_id)
  • 服务器到客户端的初始 IV: HASH(K || H || "B" || session_id)
  • 客户端到服务器的加密密钥: HASH(K || H || "C" || session_id)
  • 服务器到客户端的加密密钥: HASH(K || H || "D" || session_id)
  • 客户端到服务器的完整性密钥: HASH(K || H || "E" || session_id)
  • 服务器到客户端的完整性密钥: HASH(K || H || "F" || session_id)

密钥数据必须从散列输出的开头获取.根据需要从散列值的开头获取尽可能多的字节.如果所需的密钥长度大于 HASH 的输出, 则通过计算 K 和 H 与迄今为止的整个密钥的连接的 HASH 来扩展密钥, 并将结果字节 (与 HASH 生成的一样多) 附加到密钥.重复此过程, 直到有足够的密钥材料可用; 密钥从此值的开头获取.换句话说:

K1 = HASH(K || H || X || session_id)   (X 例如是 "A")
K2 = HASH(K || H || K1)
K3 = HASH(K || H || K1 || K2)
...
key = K1 || K2 || K3 || ...

如果 K 中的熵大于 HASH 的内部状态大小, 则此过程将损失熵.