【密码算法 之十四】非对称算法,ECC椭圆曲线算法 之 ECDSA、ECDH、SM2、SM9等
ECC(Elliptic Curve Cryptography),就是椭圆曲线密码算法,它是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在公开密钥加密和电子商业中RSA被广泛使用。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位
文章目录
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完全不同,它没有最低安全性限制(比如不再对基点阶进行限制),用户可以有充分的自由。
OpenSSL | NIST | SECCG | ANSI |
---|---|---|---|
prime192v1 | nistp192 | secp192r1 | prime192v1 |
secp224r1 | nistp224 | secp224r1 | |
prime256v1 | nistp256 | secp256r1 | prime256v1 |
secp384r1 | nistp384 | secp384r1 | |
secp521r1 | nistp521 | secp521r1 | |
sect163k1 | nistk163 | sect163k1 | |
sect163r2 | nistb163 | sect163r2 | |
sect233k1 | nistk233 | sect233k1 | |
sect233r1 | nistb233 | sect233r1 | |
sect283k1 | nistk233 | sect283k1 | |
sect283r1 | nistb283 | sect283r1 | |
sect409k1 | nistk409 | sect409k1 | |
sect409r1 | nistb409 | sect409r1 | |
sect571k1 | nistk571 | sect571k1 | |
sect571r1 | nistb571 | sect571r1 |
1.3 表示方法
椭圆曲线其实是一个数学方程,通常用下面的方程式来表示:y2 = (x3 + ax + b) mod p
如果a和b取的值不同,那么对应的曲线形状也会不一样,如下图:
1.4 曲线运算
椭圆曲线的运算有多种,包括:点加(Point Addition)、点乘(Point Multiplication)、倍点(Point Double)等。
1.4.1 点加(Point Addition)
- 两点决定一条直线,也就是说,我们定义通过两个点(P,Q) 做一条直线,找到这条直线和EC曲线相交的那个点(图1中R’点)
- 根据点加法运算的定义,可以得到 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 私钥签名
签名过程如下:
- 选择随机数r,计算点rG(x,y);
- 根据随机数r,消息M的哈希值h、私钥d,计算出 s = (h + dx)/r;
- 将消息M和签名值(rG, s)发给接收方;
举例:假设要签名的消息是一个字符串:“Hello World!”。
- 是对“待签名的消息”生成一个消息摘要,不同的签名算法使用不同的消息摘要算法,而ECDSA256使用SHA256生成256比特的摘要;
- 产生一个随机数k,利用随机数k,计算出两个大数r和s。将r和s拼在一起就构成了对消息摘要的签名;
2.2 公钥验签
- 接收方收到消息M、以及签名{rG=(x,y), s};
- 根据消息求哈希h;
- 使用发送方公钥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的比较如下:
算法 | SM2 | RSA |
---|---|---|
算法结构 | 基于椭圆曲线(ECC) | 基于椭圆曲线(ECC) |
计算复杂度 | 完全指数级 | 亚指数级 |
存储空间 | 192~256bit | 1024~8192bit |
秘钥生成速度 | 较RSA算法快百倍以上 | 慢 |
解密加密速度 | 较快 | 一般 |
4.1 数字签名
待添加
4.2 秘钥交换
待添加
4.3 加密
待添加
4.4 解密
待添加
5. SM9
待添加
6. 总结
待添加
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)