博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SM2椭圆曲线公钥密码算法
阅读量:4074 次
发布时间:2019-05-25

本文共 1443 字,大约阅读时间需要 4 分钟。

 

1      类型

SM2属于非对称加密方式,其实现方式有素域和二元扩域两种方式,我们只介绍素域的情况,二元扩域涉及到多项式运算,理解更困难。

 

2      原理

有限域上的椭圆曲线在点加运算下构成一个有限交换群,且其多倍点运算构成一个单项函数。

2.1     椭圆曲线

椭圆曲线并不是椭圆,之所以成为椭圆曲线,是因为它们与计算椭圆周长的方程相似,也使用三次方程来表示的,一般椭圆曲线的三次方程如下:

 

y ² + axy + by = x ³+ cx ² + dx + e

 

其中a, b, c, d和e是实数,x和y是在实数集上取值,不是所有的椭圆曲线都能用于加密算法,一般情况下,椭圆曲线加密算法取如下方程用于实际应用:

 

y ² = x ³+ ax + b

 

2.2     有限素域

元素个数为素数的有限域称为有限素域,记做F(q),其中q为素数。我们取整数素域F(q),元素包括{0,1,2…p-1,p}。

 

2.3     模n同余

 

假设a mod n ==b mode n, 则成a和b模n同余。

 

2.4     有限域上的椭圆曲线

 

连续的椭圆曲线并不能用于加密,为了将椭圆曲线变成离散的点,我们将椭圆曲线的系数以及变元(即x,y)取值限制在有限域上,执行模p操作,则成此曲线为有限域上的曲线,记做Ep(a,b),根据a和b的取值不同,曲线也就不同,所以Ep(a,b)是一个曲线集合,曲线公式如下:

y ² mod p = (x ³+ ax + b) mod p

 

例如,有整数有限素域为F(23),取a=1,b=1,x=9,y=7,计算结果如下:

 

y ² mod p = (x ³+ x + 1) mod p

49 mod 23 = (729 + 9+ 1) mod 23

3 = 3

 

其中系数和变元均取自有限素域。

 

下图是在F(23)上取值a=1和b=1,即y² mod 23 = (x ³ + x + 1) mod 23的点的坐标,记做E23(1,1):

 

如下表,是曲线中所有的点坐标:

 

 

阿贝尔群,即交换群。

 

2.5     加法

假设椭圆曲线上有三个点P,Q,R在同一直线上,椭圆曲线的加法定义为P+Q+R=O(O是加法中的单位元,类似于实数加法中的0),其几何描述为一条直线上的三个点的和为O,即 P + Q = O - R。

 椭圆曲线多倍点记做P =[k]Q,表示k个Q点相加的结果为P。

 

2.6     椭圆曲线公钥算法加密

 

多倍点记做P=[k]Q,则使用k作为私钥,P作为公钥,对于多倍点运算而言,反向取K得值是数学难题。

 

3      优缺点

 

相比较其他公钥算法,椭圆曲线使用更短的密钥串就能实现比较牢固的加密强度,同时由于密钥串相对较短,加密速度也就相对较快。

 

 

4      应用场景

SM2算法规定了三个应用场景,分别是数字签名,密钥交换和加密解密。

 

4.1     数字签名

数字签名还需要SM3杂凑算法的辅助实现,SM3算法是一种摘要算法。

大致描述如下:

主要采用的方式是签名方对A用户的身份信息和需要进行签名的信息做哈希算法,将生成的hash串与私钥关联。

 验证方则通过公钥信息对签名串进行验证。

 

4.2     密钥交换

 密钥交换实际上是利用公钥和私钥的属性,双方协商密钥的过程,具体参照国密局文档。

4.3     加密解密

加密解密的过程实际上是在密钥交换的基础上进行的(虽然方式不同),最终两方协商可以得到同一个加密密钥,后续进行的实际上是对称加解密的内容,具体请参照国密局文档。

 

5      参考文档

  1. 《密码编码学与网络安全:原理与实践》
  2. 国密局sm2算法文档

转载地址:http://ylyni.baihongyu.com/

你可能感兴趣的文章
[教程] Packt - Create a Game Environment with Blender and Unity by Darrin Lile
查看>>
[教程] Packt - Create a Game Environment with Blender and Unity by Darrin Lile
查看>>
详解Unity Profiler内存分析问题
查看>>
essential
查看>>
k8s安装
查看>>
c++ python 实现AES加密 基于openssl
查看>>
python正则提取mysql中文数据
查看>>
python刷赞
查看>>
python收集网页中的翻页
查看>>
成语接龙
查看>>
python3调用腾讯AI开放平台
查看>>
城市接龙
查看>>
Python操作Firefox
查看>>
python3调用OCR识别
查看>>
三个机器人尬聊
查看>>
世界杯买球算法
查看>>
阶乘、阶乘之和的函数式风格实现
查看>>
SVN部署(本地)
查看>>
SVN部署(远程)服务器篇
查看>>
SVN部署(远程)客户端篇
查看>>