SM2:非对称算法,为国家密码管理局公布的公钥算法,其加密强度为256位。
SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名、密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。
椭圆曲线参数并没有给出推荐的曲线,曲线参数的产生需要利用一定的算法产生。但在实际使用中,国密局推荐使用素数域256 位椭圆曲线,其曲线方程为y^2= x^3+ax+b(其中p是大于3的一个大素数,n是基点G的阶,Gx、Gy 分别是基点G的x与y值,a、b是随圆曲线方程y^2= x^3+ax+b的系数)。
SM3:哈希算法,密码杂凑算法,杂凑值长度为32字节,和SM2算法同期公布,参见《国家密码管理局公告(第 22 号)》;
SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息 认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。
二、非对称加密算法
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
所有的非对称加密算法,都是基于各种数学难题来设计的,这些数学难题的特点是:正向计算很容易,反向推倒则无解。
RSA 的数学难题是:两个大质数 p、q 相乘的结果 n 很容易计算,但是根据 n 去做质因数分解得到 p、q,则需要很大的计算量。RSA 是比较经典的非对称加密算法,它的主要优势就是性能比较快,但想获得较高的加密强度,需要使用很长的密钥。
ECC 是基于椭圆曲线的一个数学难题设计的。目前学术界普遍认为,椭圆曲线的难度高于大质数难题,160 位密钥的 ECC 加密强度,相当于 1088 位密钥的 RSA。因此,ECC 是目前国际上加密强度最高的非对称加密算法。
国密算法 SM2 也是基于椭圆曲线问题设计的,属于国家标准,算法公开,加密强度和国际标准的 ECC 相当。而国密的优势在于国家的支持和认可
工作过程
1、乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。
2、得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。
3、乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。
在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。
同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。
特点:
功能不一样:对称算法主要用于加密和解密,而公开秘钥算法可以用于加密解密、秘钥协商、数字签名
运算速度很慢:相比对称加密算法来说,公开秘钥算法尤其是RSA算法运算非常慢
秘钥是一对:对称加密算法中,密钥是一串数字,加密者和解密者使用同样的密钥.公开密钥算法是一对,分别为公钥和私钥
标准:
RSA算法主要使用PKCS#I定义了两种机制处理填充问题,从而保证同样的明文、同样的密钥经过RSA加密,每次的密文都是不一样的
两种填充机制分别是RSAES-PKCSI-VI_5和RSAES-OAEP,目前推荐使用的填充标准是RSAES-OAEP,OpenSSL命令行默认使用的标准是RSAES-PKCSI-VI_5
数字签名、数字证书
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
每个人都有一对“钥匙”(数字身份),其中一个只有她/他本人知道(密钥),另一个公开的(公钥)。签名的时候用密钥,验证签名的时候用公钥。又因为任何人都可以落款声称她/他就是你,因此公钥必须向接受者信任的人(身份认证机构)来注册。注册后身份认证机构给你发一数字证书。对文件签名后,你把此数字证书连同文件及签名一起发给接受者,接受者向身份认证机构求证是否真地是用你的密钥签发的文件。
假设两个用户A,B进行通信,公钥为c,私钥为d,明文为x.
A用公钥对明文进行加密形成密文c(x),然后传输密文;
B收到密文,用私钥对密文进行解密d(c(x)),得到要通信的明文x。
补充:如果是 A 同时和 B, C 通信,如果C的私钥为eC收到密文,用私钥对密文进行解密e(c(x)),得到要通信的明文x。c 是公钥, d、e 是私钥。用不同的私钥解密,能得到同样的结果。这个过程通过很巧妙的数学来实现。
加密:公钥加密、私钥解密
认证/签名:私钥加密、公钥解密
知乎上比较透彻的一篇文章:https://www.zhihu.com/question/24294477?sort=created