国密算法学习整理

第1章 解读DES和SM4、RSA和SM2及SM3

2章 PBOC3.0中使用的国密SM2算法

1章解读DES和SM4、RSA和SM2及SM3

1.1概念说明:

国密算法是由国家密码局发布,包含SM1\ SM2\ SM3\ SM4\ SSF33算法,其中SM1是硬件实现的算法,这里不与讨论,而SM2、SM3、SM4等可以使用软件实现,这里后续重点研究。另外国际算法由美国的安全局发布,是现今最通用的商用算法。密码学中应用最为广泛的的三类算法包括对称算法(分组密码算法)、非对称算法(公钥密码算法)、杂凑算法(摘要算法)在这里以分组密码算法(DES和SM4)、公钥密码算法(RSA和SM2)、摘要算法(SM3)为例,介绍一下国密算法、国际算法及两者的区别。

1.2分组密码算法——国际DES、国产SM4

  分组密码就是将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密,从而将各个明文分组变换成一个等长的密文分组的密码。其中二进制明文分组的长度称为该分组密码的分组规模。

  分组密码的实现原则如下:

(1)必须实现起来比较简单,知道密钥时加密和脱密都十分容易,适合硬件和(或)软件实现.

(2)加脱密速度和所消耗的资源和成本较低,能满足具体应用范围的需要.

  分组密码的设计基本遵循混淆原则和扩散原则。

  混淆原则就是将密文、明文、密钥三者之间的统计关系和代数关系变得尽可能复杂,使得敌手即使获得了密文和明文,也无法求出密钥的任何信息;即使获得了密文和明文的统计规律,也无法求出明文的任何信息。

  扩散原则就是应将明文的统计规律和结构规律散射到相当长的一段统计中去。也就是说让明文中的每一位影响密文中的尽可能多的位,或者说让密文中的每一位都受到明文中的尽可能多位的影响。

1.2.1 DES算法

DES算法是在美国NSA(国家安全局)资助下由IBM公司开发的密码算法,其初衷是为政府非机密的敏感信息提供较强的加密保护。它是美国政府担保的第一种加密算法,并在1977年被正式作为美国联邦信息处理标准。DES主要提供非军事性质的联邦政府机构和私营部门使用,并迅速成为名声最大,使用最广的商用密码算法。

1.2.2 SM4算法

2006年我国公布了无限局域网产品使用的SM4密码算法。这是我国第一次公布自己的商用密码算法。

 国际的DES算法和国产的SM4算法的目的都是为了加密保护静态储存和传输信道中的数据,主要特性如下:

  des算法 SM4算法
计算基础 二进制 二进制
算法结构 使用标准的算术和逻辑运算、先代替后 置换,不含非线性变换 基本轮函数加迭代、含非线性变换
加解密算法是否相同
计算轮数 16轮(3des为16轮*3) 32轮
分组长度 64位 128位
秘钥长度 64位(3DES为128位) 128位
有效秘钥长度 56位(3des位112位) 128位
实现难度 易于实现 易于实现
实现性能 软件实现慢、硬件实现快 软件实现和硬件实现都快
安全性 较低(3des较高) 算法教新,还未经过现实校验
算法上看,国产 SM4算法在计算过程中增加非线性变换,理论上能大大提高其算法的安全性,并且由专业机构进行了密码分析,民间也对21轮SM4进行了差分密码分析,结论均为安全性较高。

1.3 公钥密码算法——国际RSA、国产SM2

公钥密码学与其他密码学完全不同, 使用这种方法的加密系统,不仅公开加密算法本身,也公开了加密用的密钥。

  公钥密码系统与只使用一个密钥的对称传统密码不同,算法是基于数学函数而不是基于替换和置换。公钥密码学是非对称的,它使用两个独立的密钥,即密钥分为公钥和私钥,因此称双密钥体制。双钥体制的公钥可以公开,因此称为公钥算法。

  公钥算法的出现,给密码的发展开辟了新的方向。公钥算法虽然已经历了20多年的发展,但仍具有强劲的发展势头,在鉴别系统和密钥交换等安全技术领域起着关键的作用

公钥算法的加密与解密由不同的密钥完成,并且从加密密钥得到解密密钥在计算上是不可行的。通常,公钥算法的两个密钥中任何一个都可以作为加密而另一个用作解密,但不是所有的公钥算法都是如此。

1.3.1 RSA算法

RSA算法由Rivest、Shamir、Adleman于1978年首次发表,是迄今为止最容易理解和实现的公钥算法,已经受住了多年深入的攻击,其理论基础是一种特殊的可逆模幂运算,其安全性基于分解大整数的困难性。

RSA算法既可用于加密,又可用于数字签名,已得到广泛采用,并被许多标准化组织(如ISO、ITU、IETF和SWIFT等)接纳。目前许多国家标准仍采用RSA算法或它的变型。

RSA算法的实现如下:

(1) 实现者寻找出两个大素数p和q

(2) 实现者计算出n=pq 和φ(n)=(p-1)(q-1)

(3) 实现者选择一个随机数e (0

(4) 实现者使用辗转相除法计算d=e-1(modφ(n))

(5) 实现者在目录中公开n和e作为公钥

  密码分析者攻击RSA体制的关键点在于如何分解n。若分解成功使n=pq,则可以算出φ(n)=(p-1)(q-1),然后由公开的e,解出秘密的d。所以说RSA算法的安全性基于分解大整数的困难性。

1.3.2 SM2算法

SM2算法由国家密码管理局于2010年12月17日发布,全称为椭圆曲线算法,SM2算法标准公布如下:http://www.oscca.gov.cn/News/201012/News_1197.htm。

椭圆曲线并不是椭圆,之所以称为椭圆曲线是因为它们是用三次方程来表示的,并且该方程与计算椭圆周长的方程相似。一般而言,椭圆曲线的三次方程形为:

  y^2+axy+by=x^3+cx^2+dx+e [其中a,b,c,d和e是满足某些条件的实数,因为方程中的指数最高是3,所以我们称之为三次方程,或者说方程的次数为3]

SM2算法使用的方程为:y^2= x^3 + ax + b

SM2算法实现如下:

(1) 选择Ep(a,b)的元素G,使得G的阶n是一个大素数

(2) G的阶是指满足nG=O的最小n值

(3) 秘密选择整数k,计算B=kG,然后公开(p,a,b,G,B),B为公钥,保密k,k为私钥

  加密M:先把消息M变换成为Ep(a,b)中一个点Pm,然后,选择随机数r,计算密文Cm={rG,Pm+rP),如果r使得rG或者rP为O,则要重新选择r。

  解密Cm: (Pm+rP)-k(rG)=Pm+rkG-krG=Pm

SM2算法的安全性基于一个数学难题”离散对数问题ECDLP”实现,即考虑等式Q=KP,其中Q、P属于Ep(a,b),K

  现今对椭圆曲线研究的时间短,经过许多优秀的数学家的努力,至今一直没有找到亚指数级算法。正是由于目前所知求解ECDLP的最好方法是指数级的,这使得我们选用SM2算法作加解密及数字签名时,所要求的密钥长度比RSA要短得多。

国际的RSA算法和国产的SM2算法的主要特性对比如下:

  RSA算法 SM2算法
计算结构 基于特殊的可逆模幂运算 基于椭圆曲线
计算复杂度 亚指数级 完全指数级
相同的安全性能下所需要的公钥位数 较多 较少(160位的SM2与1024位的RSA具有相同的安全等级)
密钥生成速度 较RSA算法快百倍以上
解密加密速度 一般 较快
安全性 基于分解大整数的难度 基于离散对数问题、fcdlp数学难题

1.4 摘要算法——国产SM3

 摘要函数在密码学中具有重要的地位,被广泛应用在数字签名,消息认证,数据完整性检测等领域。摘要函数通常被认为需要满足三个基本特性:碰撞稳固性,原根稳固性和第二原根稳固性。

2005年,Wang等人给出了MD5算法和SHA-1算法的碰撞攻击方法,现今被广泛应用的MD5算法和SHA-1算法不再是安全的算法。

SM3密码摘要算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。SM3算法适用于商用密码应用中的数字签名和验证,是在SHA-256基础上改进实现的一种算法。SM3算法采用Merkle-Damgard结构,消息分组长度为512位,摘要值长度为256位。

SM3算法的压缩函数与SHA-256的压缩函数具有相似的结构,但是SM3算法的设计更加复杂,比如压缩函数的每一轮都使用2个消息字。

现今为止,SM3算法的安全性相对较高。

安全是智能卡的核心,而算法是安全的基础。

第2章谈谈PBOC3.0中使用的国密SM2算法

2.1 知识准备

SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法。本身是基于椭圆曲线(ECC)算法的,所以要讲SM2, 先要弄懂ECC,完全理解ECC算法需要一定的数学功底,因为涉及到射影平面坐标系,齐次方程求解, 曲线的运算规则等概念。这里不做过多的数学分析(主要是我自己也没有完全整明白)。想要深入了解ECC的推荐网名为ZMWorm 的大牛在多年前写的<<椭圆曲线ECC加密算法入门介绍>>。此人是早年看雪论坛中的一个版主,对算法和密码学很有研究。

本章节的主旨是希望能以简单通俗的语言,讲清楚PBOC3.0认证过程中,所用到的SM2的相关概念,包括它的实现,使用等。

2.1.1 椭圆曲线到底长啥样

上面是两个不同椭圆曲线在坐标系中的几何表示, 不过这个坐标系不是二维坐标系,而是射影坐标系。可以用空间思维想像一下(但是注意不是三维坐标系), 打个比方,你晚上站在一个路灯前面,地上有你的影子,你本身是在一个二维坐标系(把你想像成一个纸片),和你的影子一起构成一个射影坐标系。

  曲线的每一个点, 用三个参量表示, (X,Y,Z)。我们知道在二维坐标系里的每个图形都遵循一个方程,比如直接的二元一次方程是y=kx+b, 圆的方程是(x-a)2+(y-b)2=r2, 椭圆曲线在射影坐标系里也有自己的定义:

Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3

所有椭圆曲线上的点都满足上述方程,a1,a2,a3,a4,a6是系数,决定曲线的形状和位置。

二维坐标和射影坐标有一个对应关系,即x=X/Z, y=Y/Z, 这样就可以把上面的方程转成普通的二维坐标系方程:

y2+a1xy+a3y= x3+a2x2+a4x+a6

2.1.2 离散的椭圆曲线

上面的坐标系都是基于实数的,椭圆曲线看起来都是平滑的,如果我们限制曲线的点都必须是整数,曲线就变成离散的了,如图3所示:

 

再进一步限制,要求整数必须大于0, 小于某个大整数P, 这样就形成了一个有限域Fp.然后我们在这个有限域里定义一些点与点之间的加减乘除运算规则,比如A点加B点得到C点(记做A+B≡C (mod p)),或者A点乘以n得到K点(记做A×n≡K (mod p))。至于具体规则细节可以不用关心,只要知道有这样的操作即可。

选一条曲线,比如 y2=x3+ax+b

把它定义在Fp, 要求a,b满足:4a3+27b2≠0 (mod p)

我们把这样的曲线记为Ep(a,b)

加解密是基于这样的数学难题,K=kG,其中 K,G为曲线Ep(a,b)上的点,k是整数,小于G点(注意区分,不是我们平常说的那个意思)的阶(不用关心什么是点的阶)。给定k和G,计算K很容易;但给定K和G,求k就困难了里,G就叫做基点,k是私钥,K是公钥。

最后总结。描述一条Fp上的椭圆曲线,有六个参量: T=(p,a,b,G,n,h)。
p 、a 、b 用来确定一条椭圆曲线,
G为基点,
n为点G的阶,
h 是椭圆曲线上所有点的个数m与n相除的整数部分)

知识准备阶段知道这么多就可以了。

2.2 SM2在PBOC认证中的使用

2.2.1 签名和验签的原理

前面提到根据系数的不同,ECC曲线可以有很多,SM2使用其中一种,这就表明它的曲线方程,以及前面说到的六个参量都是固定的。根据国密局给出的规范定义如下:

 

这里容易引起一个误解,会认为参数都固定了,公私钥是不是只能有一对?当然不是,注意前面提到的K=kG的模型,K才是公钥,所以公钥其实是曲线在离散坐标系中,满足条件的一个曲线上的点。可以有很多个。另外, 从这几个参量可以获知PBOC 3.0的公钥长度都是256(32字节)位。

基于这种离散椭圆曲线原理的SM2算法一般有三种用法,1签名验签、(2加解密、(3密钥交换。PBOC 3.0中的脱机数据认证只用到签名验签的功能。终端关心的是如何验签,卡片则要考虑如何实现生成签名。

2 基于openssl实现SM2

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、PKCS7标准实现和PKCS12个人数字证书格式实现等功能。

openssl采用C语言作为开发语言,这使得它具有优秀的跨平台性能。openssl支持Linux、UNIX、windows、Mac等平台

openssl已经实现ECC算法接口,也就是核心已经有了,实现sm2其实并不难,关键是理解它里面各种接口如何使用。

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(windows开发类)