第一步:云端生产SPAKE2+
Salt:16bytes 随机数,每次在进行配对的时候,服务器都需要产生一个随机的盐值 Salt。
Cost parameter Nscrypt: 4096 or higher 是一个自行选择的常量
Block size r: 8 算法常量固定为 8
Parallelization parameter p:1 算法固定值
Output length dkLen: 80 算法生成密钥的长度为 80bytes
G: ECC的基点
n: ECC的基点的阶
ECC详解参考:https://www.cnblogs.com/jockming/p/12111681.html
z=Scrypt(pwd, Salt,Nscrypt,r,p,dkLen)
z0 = z的左40字节
z1 = z的右40字节
w0=(z0 mod (n-1)) + 1 w0:可以理解成一个根据z0生成的ECC曲线为Secp256r1的私钥
w1=(z1 mod (n-1)) + 1 w1:可以理解成一个根据z1生成的ECC曲线为Secp256r1的私钥
L= w1*G:按照ECC的规则,w1是一把私钥,那么w1*G的值就是w1的公钥,所以L就是w1的公钥
第二步:
将w0,L,salt给到车端。
将pwd发给手机端。
第三步:
车端收到后,计算Y
N:是一个公钥恒定定值
M:是一个公钥恒定定值
y:随机私钥的S值
y*G:计算y的公钥
w0*M:将w0私钥和恒定公钥点N乘后获得一个在ECC曲线上的点。充当盐值
Y=y*G+w0*N
此时车端有y,Y,w0,N,M,L,salt
车端发起 SPAKE2+ REQUEST Command
7f50
c0:salt
c1:Nscrypt
c2:r
c3:p
发送salt给到手机
手机收到后,计算出w0
z=Scrypt(pwd, Salt,Nscrypt,r,p,dkLen)
z0 = z的左40字节
w0=(z0 mod (n-1)) + 1 w0:实际为ECC私钥
w1=(z1 mod (n-1)) + 1 w1:实际为ECC私钥
然后计算出X
M:是一个公钥恒定定值
x:随机私钥的S值
x*G:计算x的公钥
w0*M:将w0私钥和恒定公钥点M乘后获得一个在ECC曲线上的点。充当盐值
X=x*G + w0*M
此时手机端有x,X,w0,w1,N,M,L,salt
手机发送X到车端
车端收到X后计算Z和V
y:随机私钥的S值
w0*M:将w0私钥和恒定公钥点乘后获得一个在ECC曲线上的点。充当盐值
X-w0×M:按照手机端计算规则等同于x*G,也就是随机私钥x的公钥
Z=y×(X-w0×M)
X-w0×M = x*G:x的公钥
y*x*G= 将y私钥和x的公钥做点乘后获得一个在ECC曲线上的点。
Z的结果就是手机端随机私钥和车机端的随机公钥在在ECC曲线上的点
V=y*L:将y私钥和w1的公钥做点乘后获得一个在ECC曲线上的点。
此时车端有X,y,Y,w0,N,M,L,salt
车端发送Y到手机
手机端:
手机收到Y后计算Z和V
此时手机有Y,x,X,w0,w1,N,M,L,salt
x:随机私钥的S值
w0*M:将w0私钥和恒定公钥点乘后获得一个在ECC曲线上的点。充当盐值
Y-w0×N:按照车端计算规则等同于y*G,也就是随机私钥y的公钥
Z=x*(Y-w0×N)
Y-w0×N = y*G:y的公钥
x*y*G= 将x私钥和y的公钥做点乘后获得一个在ECC曲线上的点。
Z的结果就是手机端随机私钥和车机端的随机公钥在在ECC曲线上的点
V=w1*(Y-w0*N)
w1*(Y-w0*N) = w1*y*G 将w1私钥和y的公钥获得一个在ECC曲线上的点
此时手机端有2个ECC点,
手机端私钥和车端公钥的做点乘后获得一个在ECC曲线上的点(Z1)
将w1私钥和y的公钥获得一个在ECC曲线上的点(V1)
车端有2个ECC点
手机端公钥钥和车端私钥的做点乘后获得一个在ECC曲线上的点(Z2)
将w1公钥和y的私钥获得一个在ECC曲线上的点(V2)
按照ECC的计算规则,
Z1=Z2
V1=V2
所以之后计算CK和SK的时候,其实入参已经一致了