参考文献:SM2椭圆曲线公钥密码算法-第三部分(秘钥协商协议)
本部分规定了SM2椭圆曲线公钥密码算法的密钥交换协议,并给出了密钥交换与验证示例及相应的流程。本部分适用于商用密码 应用中的密钥交换,可满足通信双方经过两次或可选三次信息传递过程,计算获取一个由双方共同决定的共享秘密密钥(会话密钥)。同时,本部分还可为安全产品生产商提供产品和技术的标准定位以及标准化的参考,提高安全产品的可信性和互操作性。
确定密码参数运算的一个参数,它用于:
(a)加密和解密变换;
(b)同步产生共享秘钥;
(c)数字签名的生成和验证。
在通信实体之间安全地建立一个共享秘钥的协商过程。
多个用户之间建立一个共享秘密秘钥的过程,并且其中任何一个用户都不能预先确定该秘钥的值。
使用户B确信用户A拥有特定秘密秘钥的保证。
通过作用于共享秘密和双方都知道的其他参数,产生一个或多个共享秘密秘钥的函数。
将一个比特串映射为一个固定长度比特串的函数,该函数满足如下性质:
(a)对于任意给定的输出,要找其对应的输入,在计算上是不可行的;
(b)对于任意给定的输入,要找到输出相同的另一个输入,在计算上是不可行的。
杂凑函数作用于一条消息时输出的比特串。
一种执行加密/解密的算法,其中加密/解密使用的秘钥容易从计算上相互求得。
在一个协议的操作过程中发送首轮交换信息的用户。
在一个协议的操作过程中不是发送首轮交换信息的用户。
可以无歧义辨别某一实体身份的信息。
消息摘要百度百科:
------------------------------------------分割线在此,不要看我(2016.04.20更新)---------------------------------------------------
密钥交换协议是两个用户A和B通过交互的信息传递,用各自的私钥和对方的公钥来商定一个只有他们自己知道的秘密密钥。这个共享的秘密密钥通常用在某个对称密码算法中。该密钥交换协议能够用于密钥管理和协商。
(1)有限域Fq的规模q;
(2)定义椭圆曲线E(Fq)的两个参数啊,a、b∈Fq;
(3)E(Fq)上的基点G=(xG,yG)(G≠O),其中xG、yG是Fq中的两个元素;
(4)G的阶n及其可选项(如n的余因子h等)。
用户A的密钥对应包括其私钥dA和公钥PA=[dA]G=(xA,yA),用户B的密钥对应包括其私钥dB和公钥PB=[dB]G=(xB,yB)。
用户密钥对的生成算法与公钥验证算法应符合第一部分第六章的规定。
(1)密码杂凑函数:如SM3;
(2)密钥派生函数:从一个共享的秘密比特串中派生出密钥数据。在密钥协商过程中,密钥派生函数作用在密钥交换所获共享的秘密比特串上,从中产生所需要的会话密钥或进一步加密所需要的秘钥数据。
密钥派生函数需要调用秘钥杂凑函数。
(3)随机数发生器:使用国密局规定的随机数发生器。
设用户A和B协商获取密钥数据的长度为klen比特,用户A是发起方,用户B是响应方。用户A和B双方为了获取相同的密钥,应实现如下运算步骤:
w=[[log2(n)]/2]-1。(注:此处的[]指的是顶函数)
A1:用随机数发生器产生随机数rA∈[1,n-1];
A2:计算椭圆曲线点RA=[rA]G=(x1,y1);
A3:将RA发送给用户B。
B1:用随机数发生器产生随机数rB∈[1,n-1];
B2:计算椭圆曲线点RB=[rB]G=(x2,y2);
B3:从RB中取出域元素x2,按本文第一部分的4.2.7给出的方法将x2的数据类型转换为整数,计算x2`=2^w+(x2&(2^w-1));
B4:计算tB=(dB+x2`*rB)mod n;
B5:验证RA是否满足椭圆曲线的方程,若不满足则协商失败;否则从从RB中取出域元素x1,按本文第一部分的4.2.7给出的方法将x2的数据类型转换为整数,
计算x1`=2^w+(x1&(2^w-1));
B6:计算椭圆曲线点V=[h*tB](PA+[x1`]RA)=(xv,yv),若V是无穷远点,则B协商失败;否则按本文第一部分4.2.5和4.2.4给出的方法将xv,yv的数据类型转换为比特串;
B7:计算KB=KDF(xv||yv||ZA||ZB,klen);
B8:(选项)按本文第一部分4.2.5和4.2.4给出的方法将RA的坐标x1、y1和RB的坐标x2、y2的数据类型转换为比特串,计算SB==Hash.......;
B9:将RB、(选项SB)发送给用户A;
A4:从RA中提取出域元素x1,按本文第一本分4.2.7给出的方法将x1的数据类型转换为整数,计算x1`=2^w+(x1&(2^w-1));
A5:tA=(dA+x2`*rA)mod n;
A6:验证RB是否满足椭圆曲线的方程,若不满足则协商失败;否则从从RB中取出域元素x2,按本文第一部分的4.2.7给出的方法将x2的数据类型转换为整数,
计算x2`=2^w+(x2&(2^w-1));
A7:计算椭圆曲线点U=[h*tA](PB+[x2`]RB)=(xu,yu),若U是无穷远点,则A协商失败;否则按本文第一部分4.2.5和4.2.4给出的方法将xu,yu的数据类型转换为比特串;
A8:计算KA=KDF(xu||yu||ZA||ZB,klen);
A9:(选项)计算S1,并检验S1=SB是否成立,若不成立则从B到A的秘钥确认失败;
A10:(选项)计算SA,并将SA发送给用户B。
B10:计算S2,并检验S2=SA是否成立,若不成立则从A到B的秘钥确认失败。
、