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)。