1. ECC椭圆曲线

  ECC(Elliptic Curve Cryptography),就是椭圆曲线密码算法,它是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在公开密钥加密和电子商业中RSA被广泛使用。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密(有待考证)。
  ECDSA(Elliptic Curve Digital Signature Algorithm)算法是基于 ECC 的的一种签名算法,广泛用于区块链、HTTPS 等需要非对称加密的场景。

1.1 曲线类型

  曲线分为素数域曲线、二元域曲线。

  • 素数域:P-192、P-224、P-256、P-384、P-521
  • 二元域:K-163、K-233、K-283、K-409、K-571、B-163、B-233、B-283、B-409、B-571

1.2 曲线标准

  曲线标准主要有:SECG / NIST / WTLS / ANSI X9.62 / RFC 5639 / SM2

  • SECG
    (1)SECG(Standards for Efficient Cryptography Group),高效密码学标准组织(SECG),它是一个行业联盟,成立于1998年,旨在开发商业标准,输出SEC标准规范;
    (2)SECG成员包括信息安全行业的领先技术公司和关键行业参与者。主要输出SEC的规范;
    (3)SECG官网:https://www.secg.org/

  • NIST
    (1)NIST(National Institute of Standards and Technology),是美国国家标准技术研究所,前身是美国国家标准局,目前是隶属于商务部的政府实验室。主要从事标准测量方面的研究,职能类似中国计量院或者法国的LNE,为业界提供国家计量标准,计量检测和校准技术,参加标准委员会制定标准等,但本质上还是一个大型的实验室。有两个分部,一个在马里兰州的Gaithersburg,一个在科州的Boulder;
    (2)NIST是美国的标准,并不是世界标准;
    (3)NIST官网:https://www.nist.gov/

  • WTLS
    WTLS(Wireless Transport Layer Security),无线传输层安全,它是无线应用协议(WAP)的安全级别,特别是针对使用WAP的应用程序。
    官网:https://www.techtarget.com/searchmobilecomputing/definition/Wireless-Transport-Layer-Security

  • ANSI X9.62
    该项目始于1995年,并于1999年正式作为ANSI标准颁布。ANSI X9.62具有高安全性和通用性。它的基域可以是Fp,也可以是F2m。F2m中的元素可以以多项式形式或正规基形式来表示。若用多项式形式,ANSI X9.62要求模多项式为不可约三项式,标准中提供了一些不可约三项式,另外还给出了一个不可约五项式。为了提高通用性,针对每一个域提供了一个模多项式。若使用正规基表示方法,ANSI X9.62规定使用高斯正规基。椭圆曲线最主要的安全因素是n,即基点阶,ANSI X9.62的n大于2160。椭圆曲线是使用随机方法选取的。ANSI X9.62规定使用以字节为单位的字符串形式来表示曲线上的点,ASN.1语法可以清楚地描述域参数,公钥和签名。

  • RFC5639
    ECC曲线标准
    官网:https://www.rfc-editor.org/

  • FIPS 186-2
    1997年,NIST开始制定包括椭圆曲线和RSA签名算法的FIPS 186标准。1998年,NIST推出了FIPS186,它包括RSA与DSA数字签名方案,这个方案也称为FIPS 186-1。1999年NIST又面向美国G0vment推出了15种椭圆曲线。这些曲线都遵循ANSI X9.62和IEEE 1363-2000的形式。2000年,包含ANSI X9.62中说明的ECDSA,使用上述曲线的FIPS 186-2问世。

  • SM2
    SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。
    SM2是基于椭圆曲线的非对称算法,相对于RSA算法,SM2具有密钥更小,运算速度更快,相同密钥长度下具有更高安全性等优势。

  • IEEE 1363-2000
    该标准于2000年作为IEEE标准问世。IEEE 1363的覆盖面很广,包括公钥加密,密钥协商,基于IFP、DLP、ECDLP的数字签名。它与ANSI X9.62和FIPS 186完全不同,它没有最低安全性限制(比如不再对基点阶进行限制),用户可以有充分的自由。

OpenSSLNISTSECCGANSI
prime192v1nistp192secp192r1prime192v1
secp224r1nistp224secp224r1
prime256v1nistp256secp256r1prime256v1
secp384r1nistp384secp384r1
secp521r1nistp521secp521r1
sect163k1nistk163sect163k1
sect163r2nistb163sect163r2
sect233k1nistk233sect233k1
sect233r1nistb233sect233r1
sect283k1nistk233sect283k1
sect283r1nistb283sect283r1
sect409k1nistk409sect409k1
sect409r1nistb409sect409r1
sect571k1nistk571sect571k1
sect571r1nistb571sect571r1

1.3 表示方法

  椭圆曲线其实是一个数学方程,通常用下面的方程式来表示:y2 = (x3 + ax + b) mod p

  如果a和b取的值不同,那么对应的曲线形状也会不一样,如下图:
在这里插入图片描述

1.4 曲线运算

  椭圆曲线的运算有多种,包括:点加(Point Addition)、点乘(Point Multiplication)、倍点(Point Double)等。

1.4.1 点加(Point Addition)

在这里插入图片描述

  1. 两点决定一条直线,也就是说,我们定义通过两个点(P,Q) 做一条直线,找到这条直线和EC曲线相交的那个点(图1中R’点)
  2. 根据点加法运算的定义,可以得到 P+Q+R’=0 ,那么 P+Q=−R’ , − R’的定义是关于 x 轴对称所得到的一个点R,如上图所示,这就是点加法的定义

1.4.2 点乘(Point Multiplication)

  “点加”是ECC计算中最基本和原始的概念,它描述群当中的两个元素(点)之间的操作,实际运算中大量使用的是“点乘”。但是不要被点乘这个名字所迷惑,其实它描述的是:对同一个点进行多次操作时的规则。
  很多常见的写法例如 kG,很容易误导初学者,其实这个kG描述的其实是:针对点G进行“k-1”次点加操作。比如k = 4,如何计算4G呢,既然我们知道如何任意两个点的点加,那么计算4G无非就是:
  第1步:计算G+G得到2G
  第2步:计算2G+G得到3G
  第3步:计算3G+G得到4G,计算完成。

1.4.3 倍点(Point Double)

  倍点其实就是点加的特殊运算,当P和Q完全重合时,就变成了倍点运算。如下图:
在这里插入图片描述

2. ECDSA

  ECDSA,即ECC椭圆曲线签名算法。设私钥、公钥分别为d、Q,即Q = dG,其中G为基点。

2.1 私钥签名

签名过程如下:

  1. 选择随机数r,计算点rG(x,y);
  2. 根据随机数r,消息M的哈希值h、私钥d,计算出 s = (h + dx)/r;
  3. 将消息M和签名值(rG, s)发给接收方;

举例:假设要签名的消息是一个字符串:“Hello World!”。

  1. 是对“待签名的消息”生成一个消息摘要,不同的签名算法使用不同的消息摘要算法,而ECDSA256使用SHA256生成256比特的摘要;
  2. 产生一个随机数k,利用随机数k,计算出两个大数r和s。将r和s拼在一起就构成了对消息摘要的签名;

2.2 公钥验签

  1. 接收方收到消息M、以及签名{rG=(x,y), s};
  2. 根据消息求哈希h;
  3. 使用发送方公钥Q计算:hG/s + xQ/s,并与rG比较,如相等即验签成功(原理:hG/s + xQ/s = hG/s + x(dG)/s = (h+xd)G/s = r(h+xd)G / (h+dx) = rG))。

3. ECDH

  ECDH 是椭圆曲线的笛福赫尔曼算法的变种,它其实不单单是一种加密算法,而是一种密钥协商协议,也就是说 ECDH 定义了(在某种程度上)密钥怎么样在通信双方之间生成和交换,至于使用这些密钥怎么样来进行加密完全取决通信双方。

ECDH的工作流程如下:
(1)Alice 和 Bob 生成各自的私钥和公钥。
  Alice的私钥为 dA,公钥为 HA = dAG
  Bob的私钥为 dB,公钥为 HB = dBG

Alice 和 Bob 需要使用一样的主要参数:在同一条曲线的同一个有限域上选择一样的基点 G。

(2)Alice和Bob通过不安全信道交换各自的公钥 HA HB,中间人可以窃听到和,但是在无法攻破离散对数难题的情况下无法得到 dA dB
(3)Alice计算 S = dAHB(使用自身的私钥和Bob的公钥),Bob计算 S = dBHA(使用自身的私钥和Alice的公钥),双方求得的S是一样的,因为 S = dAHB = dA(dBG) = dB(dAG) = dBHA

4. SM2

  SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。
  SM2是基于椭圆曲线的非对称算法,相对于RSA算法,SM2具有密钥更小,运算速度更快,相同密钥长度下具有更高安全性等优势。
  国密SM2算法标准包括5个部分:

  • GMT 0003.1-2012 SM2椭圆曲线公钥密码算法第1部分:总则
    主要介绍了ECC基本的算法描述,包括素数域和二元扩域两种算法描述
  • GMT 0003.2-2012 SM2椭圆曲线公钥密码算法第2部分:数字签名算法
    这个算法不同于ECDSA算法,其计算量大,也比ECDSA复杂些,也许这样会更安全吧
  • GMT 0003.3-2012 SM2椭圆曲线公钥密码算法第3部分:密钥交换协议
    与ECDH功能相同,但复杂性高,计算量加大
  • GMT 0003.4-2012 SM2椭圆曲线公钥密码算法第4部分:公钥加密算法
    使用ECC公钥进行加密和ECC私钥进行加密算法,其实现上是在ECDH上分散出流密钥,之后与明文或者是密文进行异或运算,并没有采用第3部分的密钥交换协议产生的密钥。
  • GMT 0003.5-2012 SM2椭圆曲线公钥密码算法第5部分:参数定义
    给出了SM2使用素数域256位椭圆曲线参数

  SM2与RSA的比较如下:

算法SM2RSA
算法结构基于椭圆曲线(ECC)基于椭圆曲线(ECC)
计算复杂度完全指数级亚指数级
存储空间192~256bit1024~8192bit
秘钥生成速度较RSA算法快百倍以上
解密加密速度较快一般

4.1 数字签名

待添加

4.2 秘钥交换

待添加

4.3 加密

待添加

4.4 解密

待添加

5. SM9

待添加

6. 总结

待添加

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐