基于ECC算法的衍生算法
- ECDH(ECC+DH)
- RSA
- ECDHE(ECC+DHE)
ECDH**协商(ECC+DH)
- 椭圆曲线密码学是属于非对称密码学的,其私钥的计算公式如下:
- 私钥是一个随机数d,取值范围在1……n-1,其中n是子群的阶
- 公钥是点H=dG,G是子群的基点
- 如果知道私钥d 和椭圆曲线参数G,求公钥H是很容易的,但是只知道公钥H和椭圆曲线参数G,求解私钥d是非常困难的,需要解决离散对数难题,椭圆曲线的安全性保证有赖于此。
- ECDH**协商算法基于椭圆曲线密码系统(ECC),使用较短的**长度可提供与RSA或DH算法同等的安全等级,**长度有160 ~ 256位比特的椭圆曲线算法与**长度1024 ~ 3072位比特的非ECC算法安全强度相同。
常用有限域上的椭圆曲线
椭圆曲线由以下参数组成
T=(p,a,b,G,n,h)
- p 有限域中的大素数,长度一般224比特、256比特、384比特
- a 整数,椭圆方程系数
- b整数,椭圆方程系数
- G,椭圆曲线上某点,生成元
- n,为一个素数,表示椭圆曲线的阶
- h,余因数
- 其中G包含Gx和Gy一共2个参数,非压缩模式以04开始,压缩模式以03开始,实际使用中一般采用非压缩模式
- 通过模数p和系数a,b构成椭圆曲线方程y^2=x^3+ax+b mod p
- TLS支持很多椭圆曲线,常用的有2个secp256r1和secp284r1 : secp256r1大素数p长度256比特(32字节)和secp384r1大素数p长度384比特(48字节)
ECDH**协商步骤
- ECDH其实和DH思想是一样的,只不过这是基于椭圆曲线离散对数实现的。
ECDH共享参数
- Alice和Bob进行ECDH**协商之前双方要有共同的ECDH共享参数,即必须选择相同的椭圆曲线方程、大素数p、生成源G,实际中这些椭圆曲线已经被相关组织批准,比如上边的secp256r1和secp384r1,通过这个双方就确定了这些共享参数
ECHD**协商
- Alice选择一个比椭圆曲线阶小的随机数HA作为私密参数,计算公钥HA=dAG发送给Bob
- Bob选择一个比椭圆曲线阶小的随机数HB作为私密参数,计算公钥HB=dBG发送给Alice
- Bob收到HA并计算得到共享**参数S=dBHA
- Alice收到HB并计算得到共享**参数S=dAHB
- 根据椭圆曲线结合律S=dAHB=dAdBG=dBdAG=dBHA。目前Alice和Bob就得到了相同的S,但是第三方即使知道椭圆曲线和HA、HB的前提下,是无法获取S的,因为在推导S的时候是需要知道其中一个私钥,这必须**椭圆曲线离散对数难题,这个是很难**的。 应用上,一般先利用ECDH协商共享**,再利用共享**计算出对称**等其他需要的**,通信双发对数据进行对称加密安全通信。
问题
- 如果采用静态的 DH 算法和 ECC 结合就是 ECDH 算法。这种方式每次都使用的相同的 G 基点,它的优点在于可以避免每次在初始化连接时服务器频繁生成 G。这个过程比较消耗 CPU。但是它带来的缺点是,一旦随机数 a、b 被泄露了,那么在这之前的所有会话都将会被解密。
- 为了解决这个问题,于是出现了 DHE 算法(Diffie-Hellman Ephemeral ,短暂临时的 DH 算法),结合 ECC 后形成了 ECDHE 算法。它可以保证每次通信使用的共享**都是不同的,DH **对仅仅保存在内存中,不像 RSA 的私钥保存在磁盘上,攻击者即使从内存中**了私钥,也仅仅影响本次通信,所以无需担心在此之前的通信内容会被解密,这样的特征成为前向安全性(Forward Secrecy,FS)或者完全前向安全性(Perfect Forward Secrecy,PFS)。更安全的是,协商出会话**后,a 和 b 两个私钥可以丢弃,进一步提升了安全性,在有限的时间、有效的空间生成了**对。在 TLS 握手中使用的 ECDHE_ECDSA 和 ECDHE_RSA **交换算法。
如下图