1、公钥密码算法模型

        公钥密码算法也成为非对称密码算法,主要应用场景包括数据签名验签、数据加解密、密钥协商/交换、密钥封装分发。公钥密码算法拥有一对密钥,分别称为公钥和私钥。当然这对公钥和私钥是密切相关的,从私钥可以推导出公钥,但从公钥推导出私钥在计算上是不可行的。注意这里只是基于当前的计算机计算水平来说计算上是不可行的。

公钥算法名称

数字签名

加解密

密钥协商

密钥封装分发

RSA

支持

支持

支持

支持

SM2

支持

支持

支持

支持

SM9

支持

支持

支持

支持

EIGamal

支持

支持

支持

支持

Diffie-Hellman



支持


DSS

支持




1.1 数字签名算法

        数字签名主要用于确认数据的完整性、签名者身份的真实性和签名行为的不可否认性。数字签名使用私钥对消息进行签名,再使用公钥对签名进行验证。同时,为了提升效率和安全性,数字签名算法中一般都需要先使用密码杂凑算法(如SM3、SHA2)对原始消息进行杂凑运算,再对得到的消息摘要进行数字签名。

1.2公钥加密算法

        公钥加密计算复杂度较高,公钥加密效率一般比对称加密算法的加密速度慢很多,所以公钥密码算法一般用于高价值短数据加密。具体算法过程是先需要查找到接受者的公钥,然后用该公钥加密要保护的消息;当接收方接收到消息后,用自己的私钥解密出消息。

1.3密钥协商

        密钥交换或密钥协商协议是两个用户A和B通过交互的信息传递,用各自的私钥和对方的公钥来商定一个只有他们知道的秘密密钥,而这个共享的秘密密钥通常用在对称秘密算法中。

1.4密钥封装

        封装者利用解封装用户的标识产生并加密一个秘密密钥给对方,解封装用户则用相应的加密私钥解封装该秘密密钥。或者也称数字信封,即利用非对称加密技术完成的密钥加密。

2、RSA算法

        RSA算法是世界范围内第一个投入使用,也是目前应用最广泛的公钥密码算法。RSA基于大整数因子分解难题设计。私钥(d,p,q),对应公钥(n,e),具体对应关系为n=pq,ed=1mod(p-1)(q-1),p和q是两个随机的大素数。在实际使用中e的取值很小,有效长度不超过32bit(例如在很多时候直接取值65537),但d的有效长度一般都是接近于n的有效长度。所以RSA算法的加密或验签计算速度要比解密或签名速度快许多倍。

3、SM2算法

        SM2基于椭圆曲线上离散对数问题的的困难性,比RSA的密码体制更具优势。按照我国的公钥密码算法标准SM2算法的推荐参数是定义在256比特素域上的。按SM2参数定义标准,算法使用各方基于相同的公开参数,包括p,n,E和G。其中p为256位素域上的大素数,G(xG,yG)是曲线E上的n阶的基点。取一个随机数d为私钥(256bit),公钥P=dG(512bit)。显然,SM2私钥256bit远小于RSA2048,且私钥产生简单(几乎是随机产生),签名算法速度远超RSA。

4、SM9算法

         SM9标识密码算法,IBC标识密码算法是在传统的公钥基础设施PKI基础上发展而来的。主要解决在具体安全应用中PKI需要大量交换数字证书的问题,使安全应用更加易于部署和使用。SM9算法中主私钥长度256bit、主公钥长度(签名主公钥-1024bit,加密主公钥512bit);用户私钥长度(签名私钥-512bit,加密私钥-1024bit),用户公钥长度(签名公钥-1024bit,加密公钥-512bit)。

5、EIGamal算法

        在1985年由塔希尔·盖莫尔提出,可以定义在任何循环群G上,它的安全性取决于G上的离散对数难题,EIGamal算法与DH密钥协商体制密切相关。密钥长度可为160~16384位(密钥长度为8的整数倍),默认长度1024bit。

        5.1 EIGamal加密算法。用户A私钥为Xa,公钥(q,a,Ya),其中q是大素数,a是q的原根,Ya=a^Xa mod q。用户B私钥为Xb,公钥(q,a,Yb),其中Yb=a^Xb mod q。发送方B做如下计算:

        K = Ya^Xb mod q (这里K是双方共享密钥,用来加密数据M)

        C1 = a^Xb mod q (这里C1作为A获得K的媒介)

        C2 = M*K mod q (这里C2是用K加密M所获得的密文) 

        A收到C1和C2,做如下计算:-ElGamal加密算法产生的密文长度是明文的两倍

        K = C1^Xa mod q (首先获得共享密钥K)

        M = C2 *K -1 mod q (获得明文消息M)

        这里私钥X长度为,公钥Y长度为。

        5.2 EIGamal签名算法。用户A选取私钥Xa,公钥(q,a,Ya)同EIGamal加密公私钥对。对消息M签名步骤如下:

        选取随机密钥K,K属于[1,q-1],且与q-1互素;(引入随机密钥K,多次加密同意明文M结果都不同)

        计算r=a^K mod q

        计算s=(M-Xa*r)*K - 1 mod q-1

        得到签名值为(r,s)

        验证步骤如下:(收到消息M,签名值(r,s)和公钥(q,a,Ya))

        计算v1 = a^M mod q

        计算v2 = (Ya^r)*(s1^s2) mod q

        若v1=v2则验证成功。

6、DH密钥交互算法

        用户A和B各自拥有公私钥对(Xa,Ya)和(Xb,Yb),A和B共享一个素数q和整数a,且a是q的本原根。A和B交换了彼此公钥后,可以计算出公共密钥,也就可以用同一个密钥进行加密和解密。DH算法产生的密钥长度在512到1024之间,必须是64的倍数,默认是1024bit。

7、DSS数字签名规范

        DSS使用一种称为DSA的加密算法来生产数字签名,DSA是一种公钥加密算法,基于有限域上的离散对数问题。RSA算法的默认密钥长度是1024位,密钥长度必须是64的倍数,在512到1024位之间。公私钥对生产如下:

        p是一个范围大于2048bit的大素数,q是p-1的一个素因子

        x是随机生成的私钥,x属于[0,p]

        计算g = h^[(p-1)/q] mod p, h属于[1,p-1]

        计算y = g^x mod p, 公钥即为(p,q,g,y)。