SAE(WPA3-Personal)认证原理简介

椭圆曲线(Elliptic Curve)

椭圆曲线是满足公式 y 2 = x 3 + a x + b y^2 = x^3 + ax + b y2=x3+ax+b 曲线. 对于任意曲线 S = { ( x , y ) ∣ y 2 = x 3 + a x + b } S = \{(x,y)|y^2 = x^3 + ax + b\} S={(x,y)y2=x3+ax+b}, 在其之上, 可以定义运算 + + +.

集合 S S S上的运算,就是一个从 S × S S\times S S×S S S S的映射. 换句话说 A ⋅ B = F ( A , B ) = C A\cdot B=F(A,B)=C AB=F(A,B)=C, F F F是满足下列条件的映射: F F F接受两个取自 S S S的参数, 输出一个位于 S S S中的结果 C C C

介绍运算 ⋅ \cdot 的定义前, 我们需要先了解一下椭圆曲线的一些性质.

  1. 关于 x x x轴对称
  2. 过曲线上任意两点 A , B A,B A,B的连线必定和曲线交于第三点 C C C,并且这条直线和曲线除了 A , B A,B A,B之外也仅有 C C C这一个交点
  3. 对于任意 A ( x , y ) A(x,y) A(x,y), 可以定义逆元 A − 1 ( x , − y ) A^{-1}(x,-y) A1(x,y), 二者连线垂直于 x x x轴.

基于此, 我们给出运算 ⋅ \cdot 的定义. A , B A,B A,B是曲线上任意两点, C C C A , B A,B A,B连线与曲线的交点, C ′ C' C C C C关于 x x x轴的对称点, 运算 ⋅ \cdot 定义为: A ⋅ B = C ′ A\cdot B=C' AB=C
在这里插入图片描述
对于 A + A A+A A+A这个表达式, 在寻找运算结果时, 不能做连线而要做切线, 运算结果为 A + A = B ′ A+A = B' A+A=B, 可以把 A + A A+A A+A记作 2 A 2A 2A, 以此类推, 对于任意整数(关于负数可以下面的逆元定义) a a a, 都可以找到曲线上的点 a A aA aA
在这里插入图片描述

本文不想深究椭圆曲线的细节, 所以不加证明的给出运算 + + + 的以下性质:

  1. + + + 满足交换律, 即 A + B = B + A A+B=B+A A+B=B+A
  2. + + + 满足结合律, 即 ( A + B ) + C = A + ( B + C ) (A+B)+C=A+(B+C) (A+B)+C=A+(B+C)
  3. 对于任意 A ( x , y ) A(x,y) A(x,y), 可以定义逆元 − A = ( x , − y ) -A=(x,-y) A=(x,y), 二者连线垂直于 x x x轴, 可以理解为连线与曲线交于无穷远. 对于这个逆元, B + A + ( − A ) = B B+A +(-A)=B B+A+(A)=B
  4. 对于 a G = A aG=A aG=A, 在已知 G G G A A A 的情况下, 几乎无法倒推 a a a 的值

在椭圆曲线上通常把无穷远点 “ p o i n t   a t   i n f i n i t y " “point\ at\ infinity" point at infinity" 记作零元 O \mathcal{O} O .

  1. 易验证, A + ( − A ) = O A +(-A)=\mathcal{O} A+(A)=O
  2. 对于一个固定点 A A A, 假设有一个可以在曲线上移动的点 X X X, 当 X X X趋向于无穷远点时, A X AX AX连线与椭圆曲线交点趋向于 − A -A A, 即 A + O = A A+\mathcal{O}=A A+O=A
  3. 对于任意整数 k k k, k O = O k\mathcal{O}=\mathcal{O} kO=O

基于椭圆曲线的DH算法

迪菲-赫尔曼密钥交换协议(DH算法), 是一种协商密钥的算法. 在此介绍基于椭圆曲线的DH算法.

Client 和 Server 可以通过一下方式协商密钥.

条件: 需要有双方都预先知道的一条特定椭圆曲线以及曲线上一点 P P P

步骤:

  1. Client 生成随机数 c c c, 并将 C = c P C=cP C=cP 发送给Server
  2. Server 生成随机数 s s s, 并将 S = s P S=sP S=sP 发送给 Client
  3. Server 收到 C C C 后计算 K = s C = s c P K=sC=scP K=sC=scP
  4. Client 收到 S S S 后计算 K = c S = c s P = s c P K=cS=csP=scP K=cS=csP=scP
  5. 双方以 K K K 作为密钥

SAE 密钥协商

离散椭圆曲线

为了便于计算, 在密码学中没有使用连续的椭圆曲线, 而是采用了离散椭圆曲线. 离散椭圆曲线由式子 y 2 = x 3 + a x + b m o d    p y^2 = x^3 + ax + b \mod p y2=x3+ax+bmodp所表示, 它定义了如下一条曲线, 可以看出, E E E 中仅有有限个元素
E = { ( x , y ) ∣ y 2 m o d    p = x 3 + a x + b m o d    p , 0 < x < p , 0 < y < p } E = \{(x,y)|y^2\mod p= x^3 + ax + b \mod p, 0<x<p,0<y<p\} E={(x,y)y2modp=x3+ax+bmodp,0<x<p,0<y<p}
在802.11协议中, 进行密钥交换使用的是ECC(Elliptic Curve Cryptography, 椭圆曲线密码学) group. Group(群)的概念在此不做展开, 简单来说, 如果一个集合上可以定义一种满足一系列条件的运算(例如上文提到的 + + +), 那么这个集合可以叫做关于这个运算的群. 上文提到曲线 E E E 就是关于运算 + + +的群.

一个ECC group 由一个六元组 ( p , a , b , G , r , h ) (p, a, b, G, r, h) (p,a,b,G,r,h) 定义

  1. a , b a,b a,b是椭圆曲线的参数
  2. p p p 是一个素数
  3. G G G 是曲线上一个指定的点, 叫做生成元, 在SAE 密钥协商过程中没有使用到
  4. r r r G G G的素数阶, 即 r r r 是一个素数, 并且 r G = O rG=\mathcal{O} rG=O
  5. h h h 是余因子, 在SAE 密钥协商过程中没有使用到

h = 1 h=1 h=1时(SAE中使用的ECC group都满足这一点), ECC group还有如下性质:

  1. 对于 E E E中任意点 A A A, 存在整数 k k k 满足条件 A = k G A=kG A=kG
  2. 对于 E E E中任意点 A A A, r A = r k G = k ( r G ) = O rA=rkG=k(rG)=\mathcal{O} rA=rkG=k(rG)=O

SAE 密钥协商简介

在 STA 向AP 发送的Authentication commit frame中, 需要选择一个ECC group, 选定group就意味着选定了六元组 ( p , a , b , G , r , h ) (p, a, b, G, r, h) (p,a,b,G,r,h)

协议中定义了下面几种函数

  1. Z = X + Y = elem-op ( X , Y ) \bm{Z} = \bm{X} + \bm{Y} = \text{elem-op}(\bm{X}, \bm{Y}) Z=X+Y=elem-op(X,Y)
  2. Z = x Y = scalar-op ( x , Y ) \bm{Z} = x\bm{Y} = \text{scalar-op}(x, \bm{Y}) Z=xY=scalar-op(x,Y)
  3. elem-op ( X , inverse-op ( X ) ) = “ p o i n t   a t   i n f i n i t y ” \text{elem-op}(\bm{X}, \text{inverse-op}(\bm{X}))=“point\ at\ infinity” elem-op(X,inverse-op(X))=point at infinity, 即 inverse-op ( X ) = − X \text{inverse-op}(\bm{X})=-\bm{X} inverse-op(X)=X

在进行协商时, 双方会根据MAC, password 等信息生成相同的 P W E \bm{PWE} PWE. P W E \bm{PWE} PWE相当于介绍DH算法时提到的点 P P P

STA和AP都需要根据下面公式生成 c o m m i t - s c a l a r commit\text{-}scalar commit-scalar COMMIT-ELEMENT \textbf{COMMIT-ELEMENT} COMMIT-ELEMENT发送给对方.

其中 m a s k , r a n d mask, rand mask,rand是随机数, 并且满足条件 1 < r a n d < r a n d ,   1 < m a s k < r  and  ( r a n d + m a s k ) m o d    r  is greater than 1 1 < rand < r and,\ 1 < mask < r\ \text{and}\ (rand + mask) \mod r\ \text{is greater than 1} 1<rand<rand, 1<mask<r and (rand+mask)modr is greater than 1

c o m m i t - s c a l a r = ( r a n d + m a s k ) m o d    r COMMIT-ELEMENT = inverse-op ( scalar-op ( m a s k , P W E ) ) \begin{aligned} &commit\text{-}scalar = (rand + mask)\mod r \\ &\textbf{COMMIT-ELEMENT} = \text{inverse-op}(\text{scalar-op}(mask, \bm{PWE})) \end{aligned} commit-scalar=(rand+mask)modrCOMMIT-ELEMENT=inverse-op(scalar-op(mask,PWE))

对端设备收到后通过如下公式计算 K \bm{K} K, 这里的 r a n d rand rand和上面公式中的 r a n d rand rand不是同一个, 这个是接收方自己生成的 r a n d rand rand. K \bm{K} K可以理解为DH算法最终协商的密钥. 在SAE 密钥协商中, 会用它进行进一步处理派生PMK.
K = scalar-op ( r a n d , ( elem-op ( scalar-op ( p e e r - c o m m i t - s c a l a r , P W E ) ,           P E E R - C O M M I T - E L E M E N T ) ) ) \begin{aligned} &\bm{K}=\text{scalar-op}(rand,(\text{elem-op}(\text{scalar-op}(peer\text{-}commit\text{-}scalar, \bm{PWE}),\\ &\ \ \ \ \ \ \ \ \ \bm{PEER\text{-}COMMIT\text{-}ELEMENT}))) \end{aligned} K=scalar-op(rand,(elem-op(scalar-op(peer-commit-scalar,PWE),         PEER-COMMIT-ELEMENT)))
对于 K K K, 我们将它转变为我们所熟悉的形式. 假设我们现在在AP 端计算 K K K, AP 收到了 STA发送的 s t a - c o m m i t - s c a l o r = ( s t a - r a n d + s t a - m a s k ) m o d    r sta\text{-}commit\text{-}scalor=(sta\text{-}rand + sta\text{-}mask)\mod r sta-commit-scalor=(sta-rand+sta-mask)modr, AP也生成了自己 a p - r a n d ap\text{-}rand ap-rand, 那么 K K K为如下表达式
K = a p - r a n d ( s t a - s c a l a r P W E + P E E R - C O M M I T - E L E M E N T ) = a p - r a n d ( s t a - s c a l a r P W E + ( − s t a - m a s k P W E ) ) = a p - r a n d ( ( s t a - r a n d + s t a - m a s k ) m o d    r   P W E + ( − s t a - m a s k P W E ) ) = a p - r a n d ( ( s t a - r a n d + s t a - m a s k ) m o d    r − s t a - m a s k ) P W E \begin{aligned} K &=ap\text{-}rand(sta\text{-}scalar\bm{PWE}+\bm{PEER\text{-}COMMIT\text{-}ELEMENT})\\ &=ap\text{-}rand(sta\text{-}scalar\bm{PWE} + (-sta\text{-}mask\bm{PWE}))\\ &=ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r\ \bm{PWE}+(-sta\text{-}mask\bm{PWE}))\\ &=ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r-sta\text{-}mask)\bm{PWE} \end{aligned} K=ap-rand(sta-scalarPWE+PEER-COMMIT-ELEMENT)=ap-rand(sta-scalarPWE+(sta-maskPWE))=ap-rand((sta-rand+sta-mask)modr PWE+(sta-maskPWE))=ap-rand((sta-rand+sta-mask)modrsta-mask)PWE

因为 r P W E = O r\bm{PWE}=\mathcal{O} rPWE=O, 所以可以将 K K K进一步化简
K = a p - r a n d ( ( s t a - r a n d + s t a - m a s k ) m o d    r − s t a - m a s k ) P W E = ( a p - r a n d ( ( s t a - r a n d + s t a - m a s k ) m o d    r − s t a - m a s k ) ) m o d    r   P W E = ( a p - r a n d ( ( s t a - r a n d + s t a - m a s k )   − s t a - m a s k ) ) m o d    r   P W E = ( a p - r a n d × s t a - r a n d ) m o d    r   P W E \begin{aligned} K &=ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r-sta\text{-}mask)\bm{PWE}\\ &=(ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r-sta\text{-}mask))\mod r\ \bm{PWE}\\ &=(ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\ -sta\text{-}mask))\mod r\ \bm{PWE}\\ &=(ap\text{-}rand\times sta\text{-}rand)\mod r\ \bm{PWE}\\ \end{aligned} K=ap-rand((sta-rand+sta-mask)modrsta-mask)PWE=(ap-rand((sta-rand+sta-mask)modrsta-mask))modr PWE=(ap-rand((sta-rand+sta-mask) sta-mask))modr PWE=(ap-rand×sta-rand)modr PWE

同理可知, STA收到 a p - c o m m i t - s c a l o r = ( a p - r a n d + a p - m a s k ) m o d    r ap\text{-}commit\text{-}scalor=(ap\text{-}rand + ap\text{-}mask)\mod r ap-commit-scalor=(ap-rand+ap-mask)modr后也能计算出相同的 K \bm{K} K. 如此, 便完成了DH密钥交换.

P W E PWE PWE 的生成方式

802.11中规定了两种PWE的生成方式

通过循环生成 P W E PWE PWE (hunting and pecking模式)

这种模式的原理是在循环中根据password和MAC生成Hash值, pwd-value, 直至这个Hash可以作为一个ECC group中的 x x x坐标, 即 存在 ( x , y ) ∈ E , 满足 x = p w d - v a l u e 存在(x,y)\in E, 满足x=pwd\text{-}value 存在(x,y)E,满足x=pwd-value

我们注意一下这个算法需要以下输入, 在AP 和STA 输入是相同的, 所以计算得出的 P W E PWE PWE也是相同的

  1. STA-A-MAC \text{STA-A-MAC} STA-A-MAC: 参与认证的一方的MAC地址, 因为SAE是对等的, 所以参与认证的双方用 STA-A \text{STA-A} STA-A STA-B \text{STA-B} STA-B表示
  2. STA-B-MAC \text{STA-B-MAC} STA-B-MAC: 参与认证的另一方的MAC地址
  3. p a s s w o r d password password: SSID 配置的密码
  1. H \text{H} H 是一个Hash函数
  2. 算法中有个 k k k 表示最小循环次数, 该值一般为40. 如果只进行了 m ( n < k ) m(n<k) m(n<k)次循环就找到了符合条件的 p w d - v a l u e pwd\text{-}value pwd-value, 那么还是会进行循环直到循环够40次, 但后续的循环中不会再对 p w d - v a l u e , s a v e , b a s e pwd\text{-}value, save,base pwd-value,save,base做任何修改. k k k通过函数dragonfly_min_pwe_loop_iter选取.
unsigned int dragonfly_min_pwe_loop_iter(int group)
{
	if (group == 22 || group == 23 || group == 24) {
		/* FFC groups for which pwd-value is likely to be >= p
		 * frequently */
		return 40;
	}

	if (group == 1 || group == 2 || group == 5 || group == 14 ||
	    group == 15 || group == 16 || group == 17 || group == 18) {
		/* FFC groups that have prime that is close to a power of two */
		return 1;
	}

	/* Default to 40 (this covers most ECC groups) */
	return 40;
}

在这里插入图片描述在这里插入图片描述

Hash-to-curve生成方式(Hash to element, H2E)

hunting and pecking模式有一个缺陷(CVE-2019-9494), 对不同的 p a s s w o r d password password 生成 p w d - v a l u e pwd\text{-}value pwd-value 的时间是不同的, 攻击者可通过测量生成 P W E \bm{PWE} PWE所需的时间, 推断出密码验证所需的计算轮次, 进而推测密码的可能值(side-channel timing attack)。

为了应对这一风险, 802.11推出了H2E 生成方式.

H2E 的原理概括如下, 从这个原理可知, 双方生成 P W E \bm{PWE} PWE所用的材料都是一致的, 所以生成的 P W E \bm{PWE} PWE也是相同的

  1. SSID 和 password 生成两个Hash值
  2. 通过 SSWU \text{SSWU} SSWU函数将这两个Hash值直接映射到ECC group上的两点 P 1 , P 2 \bm{P1},\bm{P2} P1,P2
  3. 将二者相加得到 P T \bm{PT} PT
  4. 在Authentication时, 根据 P T , STA-A-MAC , STA-B-MAC \bm{PT},\text{STA-A-MAC}, \text{STA-B-MAC} PT,STA-A-MAC,STA-B-MAC计算 P W E \bm{PWE} PWE
  1. H , HKDF-Expand , HKDF-Extract \text{H}, \text{HKDF-Expand}, \text{HKDF-Extract} H,HKDF-Expand,HKDF-Extract 根据输入的参数生成Hash值
  2. SSWU \text{SSWU} SSWU可以输入的整数映射到ECC group上, 并且无论输入的参数如何, 计算所用的时间是相同的
  3. 注意到 P T \bm{PT} PT的生成只需要知道SSID 和 password, 所以可以在很早的阶段(例如AP配置阶段, STA网络选择阶段)计算 P T \bm{PT} PT, 在Authentication时只需要通过少量计算便可生成 P W E \bm{PWE} PWE

考察整个 P W E \bm{PWE} PWE的生成过程, 无论是计算 P T \bm{PT} PT 还是计算 P W E \bm{PWE} PWE, 计算所需时间都是一个和输入参数无关的常数, 这就很好的避免了side-channel timing attack.

在这里插入图片描述
在这里插入图片描述

SSWU \text{SSWU} SSWU定义如下

在这里插入图片描述
在这里插入图片描述

在Authentication 时根据如下公式计算 P W E \bm{PWE} PWE

在这里插入图片描述

选择 P W E PWE PWE 生成方式

支持H2E 的AP应该在Beacon和Probe Response的 RSNXE中的Extended RSN Capabilities field中将 hash-to-element 设为 1.
在这里插入图片描述
如果STA 支持H2E并且要在连接中使用H2E, 那么在Authentication commit中应将status code设置为SAE_HASH_TO_ELEMENT
在这里插入图片描述

SAE Authentication 步骤

SAE Authentication的步骤如下所示, FFE就是上文提到的 COMMIT-ELEMENT \textbf{COMMIT-ELEMENT} COMMIT-ELEMENT
STA 和AP 会先互相发送一组 commit 帧, 然后在互相发送一组 confirm 帧.

STA AP scalar, FFE scalar, FFE confirm confirm STA AP

STA Commit 帧的生成

按照上文提到方法生成 c o m m i t - s c a l a r commit\text{-}scalar commit-scalar COMMIT-ELEMENT \textbf{COMMIT-ELEMENT} COMMIT-ELEMENT发送给AP.

AP 处理 Commit 帧

AP 会检查 Commit帧中的scalar和FFE, 如果验证失败则发送一个Commit 帧并将status code设置为SECCESS和SAE_HASH_TO_ELEMENT以外的值表示认证失败. 如果认证成功则正常发送自己生成的scalar和FFE.

在这一步无法验证STA 的 P W E \bm{PWE} PWE是否正确, 即无法验证STA输入的password是否正确. 此时, 只是验证scalar和FFE是否符合协议的要求.

  1. scalar应该大于1小于 r r r(ECC group 定义中的 r r r)
  2. FFE中的 x , y x,y x,y应该满足 0 ≤ x , y < p 且 ( x , y ) 位于ECC group中 0\le x,y<p 且 (x,y)位于\text{ECC group} 中 0x,y<p(x,y)位于ECC group

当AP生成了自己的 r a n d , m a s k rand, mask randmask之后, 它便集齐了计算 K \bm{K} K(DH密钥协商的结果)所需的所有材料. AP会按照上文所提到的公式计算 K \bm{K} K, 然后再进一步通过下面的公式派生 PMK, KCK \text{PMK, KCK} PMK, KCK

  1. H \text{H} H是一个Hash函数, 或者说基于Hash实现的消息验证码生成函数
  2. k k k K \bm{K} K x x x 坐标
  3. L ( k c k _ a n d _ p m k , Q , 256 ) \text{L}(kck\_and\_pmk, Q, 256) L(kck_and_pmk,Q,256)表示截取 k c k _ a n d _ p m k kck\_and\_pmk kck_and_pmk Q Q Q到255位
  4. s a l t salt salt一般是全0的字节序列, 它的长度取决于 H \text{H} H
    在这里插入图片描述

同时 AP 还会生成一个counter, s e n d - c o n f i r m send\text{-}confirm send-confirm, 然后计算一个 c o n f i r m confirm confirm
在这里插入图片描述

CN \text{CN} CN是一个Hash函数, 或者说是一个消息验证码生成函数

AP生成 Commit 帧

按照上文提到方法生成 c o m m i t - s c a l a r commit\text{-}scalar commit-scalar COMMIT-ELEMENT \textbf{COMMIT-ELEMENT} COMMIT-ELEMENT发送给STA.

STA 处理AP 发送的 Commit帧

与AP端类似, STA要验证AP 的 scalar和FFE的合法性然后计算 PMK, KCK \text{PMK, KCK} PMK, KCK

STA 也会根据同样的公式计算 c o n f i r m confirm confirm. 需要注意的是与AP生成的 c o n f i r m confirm confirm相比,1. CN \text{CN} CN参数中的 c o m m i t - s c a l a r , C O M M I T - E L E M E N T commit\text{-}scalar, \bm{COMMIT\text{-}ELEMENT} commit-scalar,COMMIT-ELEMENT p e e r - c o m m i t - s c a l a r , p e e r - C O M M I T - E L E M E N T peer\text{-}commit\text{-}scalar, \bm{peer\text{-}COMMIT\text{-}ELEMENT} peer-commit-scalar,peer-COMMIT-ELEMENT 位置实际上是对调的, 所以 AP 的 c o n f i r m confirm confirm 与 STA 的 c o n f i r m confirm confirm 是不同的.
在这里插入图片描述

STA 发送confirm 帧

生成 c o n f i r m confirm confirm后, STA将它填入 Authentication confirm帧中发送给AP

AP 处理 STA 发送的confirm帧

AP 收到 confirm 帧后会根据下面公式计算一个 v e r i f i e r verifier verifier. 如果STA 输入的password是正确的, 那么STA所计算的 K C K KCK KCK应该与AP一致, 那么此时AP 计算的 v e r i f i e r verifier verifier应该等于STA confirm帧中的 c o n f i r m confirm confirm
在这里插入图片描述
如果 v e r i f i e r verifier verifier 不等于 STA confirm帧中的 c o n f i r m confirm confirm, 那么认证失败. AP 会向STA 发送 confirm 帧, 其中 statu code应该设置为CHALLENGE_FAILURE(15), 不过一些AP此时会将statu code设置为REFUSED_REASON_UNSPECIFIED(1). 不过无所谓, 只要confirm 帧中的statu code 不是SUCCESS 都代表认证失败.

如果 v e r i f i e r verifier verifier 不等于 STA confirm帧中的 c o n f i r m confirm confirm, 那么认证成功, AP 向STA发送confirm 帧, 其中包含AP生成的 c o n f i r m , s e n d - c o n f i r m confirm, send\text{-}confirm confirm,send-confirm 以及 status code SECCESS.

STA 处理 AP 发送的 confirm 帧

STA 同样会计算 v e r i f i e r verifier verifier来校验AP 发送的confirm 帧. 如果校验失败, 一般是发起deauthentication.

至此,便完成了一次 SAE authentication.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值