RFC5683阅读笔记
Password-Authenticated Key(PAK) Diffie-Hellman Exchange
摘要
Diffie-Hellman(简称DH)密钥交换是最早的密钥交换算法之一,使得通信双方能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。
在本文档中提出了一种算法用于在未经身份鉴别的Diffie-Hellman算法中添加双向的身份鉴别,这种算法称为Password-Authenticated Key(PAK)交换,它允许双方在执行Diffie-Hellman密钥交换时进行身份鉴别。
文档认为这种协议足够安全可以抵挡所有的主动攻击和被动攻击,而且不允许任何的攻击者获得可以用于进行字典攻击的信息。
文档规定
- A 代表实体Alice
- B 代表实体Bob
- Ra是指由A选择的随机秘密指数
- Rb是指由B选择的随机秘密指数
- Xab表示由B得出的值(X可能由A计算)
- Yba表示由A得出的值(Y可能由B计算)
- 当a除以b时,a mod b表示最小的非负余数
- Hi(u)表示在字符串u上计算的商定函数(例如基于SHA-1,SHA-256等),各种H()充当独立的随机函数,H1(u)和H2(u)是关键推导函数,H3(u)、H4(u)和H5(u)是哈希函数。
- s | t表示字符串S和T的串联
- ^表示幂
- 乘、除和求幂运算都是针对一个p元域执行的,也就是说
- ab 始终表示ab(mod p)
- a/b 始终表示a*x(mod p),x表示b模p的乘法逆
- a^b始终表示a^b(mod p)
Diffie-Hellman密钥交换算法简述
目的
使两个用户能够安全的交换密钥,以便在后续的通信中使用该密钥对消息进行加密。
密钥交换过程
在这个过程中拥有的全局公开变量,素数p和p的本原根g。
用户A和用户B分别产生秘密的两个随机数Xa和Xb。
过程如下:
- A→B:用户A计算:Ya=g^Xa mod p,并把Ya发送给用户B
- B→A:用户B计算:Yb=g^Xb mod p,并把Yb发送给用户A
- 用户A计算:K=(Yb)^Xa mod p
- 用户B计算:K=(Ya)^Xb mod p
- 这样用户A和B 都拥有了会话密钥K
安全性
安全型是基于离散对数计算的复杂性。
攻击者只能通过g、b、Ya、Yb来计算,需要计算复杂的离散对数。
1. 概述
PAK具有如下优点:
- 它提供了一个安全的、经过身份鉴别的密钥交换协议。
- 当使用密码时可以安全的方式离线字典攻击
- 它可以确保转发的保密性
- 它已经被证明和Diffie-Hellman交换密钥方案一样安全。
2. PAK流程
Diffie-Hellam交换密钥协议要求消息的发送者和接收者都创建自己的秘密,随机数,并且可以交换各自密码数字的幂。
PAK有两个用户,A和B,并且它们共享满足以下条件的秘密密码PW:
- H1(A|B|PW) != 0
- H2(A|B|PW) != 0
文档也精心选择了全局Diffie-Hellman公开的常数,素数p和生成器g,以便:
- 安全素数p足以使离散对数的计算不可行
- g以p为模的幂涵盖从1到p-1的p-1个整数的整个范围
最初,A选择一个秘密随机指数Ra并计算g ^ Ra;B选择一个秘密随机指数Rb并计算g ^ Rb。为了提高效率,可以为Ra和Rb使用短指数,只要大于某个长度就可以。
- A→B:{A, X = H1(A|B|PW)*(g^Ra)}(上述PW前提条件确保X!= 0)。
- B收到Q(Q = X),验证Q!= 0(如果Q = 0,则B中止过程);将Q除以H1(A|B|PW)得到Xab,即g^Ra的恢复值。
- B→A:{Y = H2(A|B|PW)*(g^Rb), S1 = H3(A|B|PW|Xab|g^Rb|(Xab)^Rb)}(以上关于PW的前提条件确保Y!= 0)
- A验证Y!=0;将Y除以H2(A|B|PW)得到Yba,即g^Rb的恢复值,并计算S1’= H3(A|B|PW|g^Ra|Yba|(Yba)^Ra);通过检查S1’= S1对Bob进行身份验证;如果通过验证,则设置密钥K = H5(A|B|PW|g^Ra|Yba|(Yba)^Ra)。
- A→B::S2 = H4(A|B|PW|g^Ra|Yba|(Yba)^Ra)
- B计算S2’= H4(A|B|PW|Xab|g^Rb|(Xab)^Rb)并通过检查S2’= S2来鉴别A;如果通过验证,则设置K=H5(A|B|PW|Xab|g^Rb|(Xab)^Rb)。
如果以上任何验证失败,则协议停止;否则,双方必须相互鉴别并建立密钥。
3. 参数选择
3.1 一般注意事项
在一般实现中,必须选择参数以满足[BMP00]的算法要求。
3.2 OTASP和WLAN Diffie-Hellman参数和关键扩展功能
[OTASP],[TIA683]和[WLAN]将公共参数p和g预先设置为它们的已经发布过的值。这对于防止攻击者发送伪造的p和g值,欺骗合法用户进行不正确的Diffie-Hellman求幂运算以及泄露有关密码的某些信息是十分必要的。根据[OTASP],[TIA683]和[WLAN],应将g设置为00001101,将p设置为以下1024位素数(最高有效位在前):
0xFFFFFFFF 0xFFFFFFFF 0xC90FDAA2 0x2168C234 0xC4C6628B 0x80DC1CD1 0x29024E08 0x8A67CC74 0x020BBEA6 0x3B139B22 0x514A0879 0x8E3404DD 0xEF9519B3 0xCD3A431B 0x302B0A6D 0xF25F1437 0x4FE1356D 0x6D51C245 0xE485B576 0x625E7EC6 0xF44C42E9 0xA637ED6B 0x0BFF5CB6 0xF406B7ED 0xEE386BFB 0x5A899FA5 0xAE9F2411 0x7C4B1FE6 0x49286651 0xECE65381 0xFFFFFFFF 0xFFFFFFFF
此外,如果Diffie-Hellman参数Ra和Rb使用短指数,则它们的最小位数应为384位。假设素数p为1024位长而会话密钥K为128位长,则独立的随机函数H1和H2应分别输出1152位。H3,H4和H5每个输出128位。文档使用FIPS 180 SHA-1散列函数[FIPS180]实例化[WLAN]中的随机函数,当然也可以使用SHA-256:
H1(z): SHA-1(1|1|z) mod 2^128 | SHA-1(1|2|z) mod 2^128 |...| | SHA-1(1|9|z) mod 2^128 H2(z): SHA-1(2|1|z) mod 2^128 | SHA-1(2|2|z) mod 2^128 |...| | SHA-1(2|9|z) mod 2^128 H3(z): SHA-1(3|len(z)|z|z) mod 2^128
H4(z): SHA-1(4|len(z)|z|z) mod 2^128
H5(z): SHA-1(5|len(z)|z|z) mod 2^128
为了为H1和H2创建1152个输出位,对SHA-1进行了9次调用,并使用每个输出的128个最低有效位。每次调用SHA-1的输入有效负载包括:
- 功能类型的32位,H1设置为1,H2设置为2
- 一个32位计数器值,对于SHA-1的每次调用,该值从1递增到9
- 自变量z [for(A|B|PW)
函数H3,H4和H5仅需要调用SHA-1哈希函数,它们各自的有效载荷包括:
- 32位功能类型(例如,H3为3)
- 参数z的位长的32位值
- 实际变量重复两次
最后,使用输出的128个最低有效位。
4. 安全注意事项
- 身份标识
- 任何使用PAK的协议都必须指定一种用于生成身份字符串的单个表示形式的方法。
- 共享密钥
- PAK涉及共享密钥的使用。保护共享价值并随着时间的流逝管理(限制)它们暴露出来至关重要,可以使用众所周知的安全策略和措施来实现。如果在两个以上的实体(例如Alice,Bob和Mallory)之间共享一个秘密,则Mallory可以将自己代表Alice和Bob通信而Bob不能察觉。
- Diffie-Hellman参数的选择
- 必须仔细选择参数p和g,以免损害共享机密。在PAK协议中只能使用参数p和g的先前商定值。这对于防止攻击者发送伪造的p和g值并从而以不正确的Diffie-Hellman指数欺骗另一个通信方是很有必要的。每次执行密钥协商协议时,双方还需要随机选择一个新的指数。如果双方重新使用相同的值,则“转发保密”属性将丢失。
- 此外,如果使用短指数Ra和Rb,则它们的最小大小应为384位(假设使用128位会话密钥)。
- 防范攻击
- 有一个潜在的攻击,即对乘幂乘积模为p的乘积组的所谓离散对数攻击,在这种攻击中,对手可以构造一个离散对数表以用作“字典”。必须选择足够大的素数p来防止这种攻击。在[WLAN]和[TIA683]中发布了p的适当1024位值和g的适当值。目前,这已实现。但是,较大的质数(即2048位长甚至更大的质数)肯定会提供更好的保护。重要的是要注意,一旦完成,生成器也必须更换,因此必须非常小心地执行此任务。
- 攻击者可以通过反复猜测密码并尝试进行身份验证来发起在线密码攻击。PAK的实现者应考虑采用机制(例如锁定)来防止此类攻击。
- 关于H()函数的建议
- 假设素数p为1024位长而会话密钥K为128位长,则独立的随机函数H1和H2应分别输出1152位。随机函数H3,H4和H5应该输出128位。