算法科普:非对称算法

描述

通过本文的阅读,你可以了解到以下知识:

什么是非对称加密算法?

对称加密算法和非对称加密算法最本质的区别是什么?

常见的非对称算法哪些以及它们的特性和区别是什么?

非对称加密算法的应用场景有哪些?


非对称加密算法


世界万物都是平衡的,正如计算机的世界一样,有0的地方就一定有1;同样的,在算法理论上,既然有【对称加密算法】,那肯定就会有【非对称加密算法】。

非对称算法,顾名思义:算法的执行过程是不对称的,也就是说加解密双方的密钥是不对称的。在非对称算法的理论上,密钥有公钥和私钥之分:其中私钥是代表自己唯一身份的一组密钥标识,不同的非对称加密算法,采用不同的数学理论来标识这个“唯一性”,比如RSA算法,使用的是“很大的素数”这种方法来标识;通常来说,私钥是不对外公开的,就好比藏在自己心里的秘密一样,不能被外人知晓,否则,数据的加密就变得不可靠,存在密钥泄露的风险。与私钥对应的密钥叫公钥,公钥与私钥正好相反,它是允许对外公开的,也就是任何人都可以持有加密方的公钥信息。看到这里,很多童鞋开始疑问:既然密钥(公钥)都公开了,那加密还有什么用,谈何安全性可言?有这样疑问的童鞋,大概思路还停留在【对称加密算法】的基础上,等我详细讲解完【非对称加密算法】的加密和解密,你就一定明白到底是怎么一回事了。

非对称算法的加密和解密的特点是:一段数据明文经私钥加密后,则需要使用该私钥对应的公钥做解密;反之,一段数据明文经公钥加密后,则需要使用该公钥对应的私钥做解密;即【公钥加密对应私钥解密,私钥加密对应公钥解密】。使用公式表达如下:其他E表示加密,D表示解密,PriKey表示私钥,PubKey表示公钥,A、B分别表示通讯双方,P表示数据明文,C表示数据密文。

通讯方A 通讯方B

E(P) by PriKey[A] = C 对应 D(C) by PubKey[A] = P

E(P) by PubKey[B] = C 对应 D(C) by PriKey[B] = P

通过如上公式,我们可以很清晰的看到,通讯AB双方需要使用非对称算法加密通讯报文,必须想方设法获取到对方的公钥,这样整个加密的通道才能完全打通。而前面我们也说到了,自己的公钥一般都是公开的,允许任何人持有,只要保证自己的私钥是保密的即可,这就是SSL通讯的理论基础。在SSL通讯之前,通常会有通讯握手动作,这个握手动作就是为了取得对方可信任的公钥,至于如何保证自己取得的公钥就是对方的真实公钥,而不是非法监听报文的“中间人”的假公钥,这就是SSL双向认证要解决的核心问题。该部分的内容,后续会有更为详细的文章做更近一步的介绍。


对称加密算法与非对称加密算法的本质区别


通过上面对非对称算法的介绍,大家可以了解到非对称算法核心的部分就是:密钥分为公钥和私钥,私钥保密公钥公开,私钥加密的密文需要使用公钥解密,公钥加密的密文需要私钥解密。具体的非对称算法和对称算法的区别如下表所列:

算法 密钥类型 加密解密的特点
对称加密算法 通讯双方有且只有一个共同的密钥K 加密方使用密钥K加密,解密方使用密钥K解密
非对称加密算法 密钥有分私钥和公钥; 通讯双方分别持有自己的私钥和对方的公钥; 加密方使用自己的私钥加密数据,解密方使用对方的公钥解密数据; 加密方使用对方的公钥加密数据,解密方使用自己的私钥解密数据;

非对称加密算法的分类和对比


常见的非对称加密算法有RSA算法、SM2算法;前者是国际通用的算法,后者是国密算法的一种。

RSA算法

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。【摘自: 百度百科 RSA算法 】

RSA加密算法的密钥长度不像我们所认知的对称加密算法 ,它的密钥长度是可变的,一般用位来表示,常见的有1024位和2048位,甚至4096位。密钥的位数越长,理论上来说,解密的难度越大,加密的强度就越大。综合加密级别和使用的便利性,【RSA2048】是我们最常见的。当RSA的密钥位数确定了,那它的【模长】也就确定了,模长的值为密钥位数对应的字节数;计算公式如下,其实M为模长,B为密钥的长度:

M = (B + 7) / 8 当M等于1024位时,对应的模长为128字节;当M等于2048位时,对应的模长为256字节。

了解【模长】的概念之后,我们需要知道RSA算法执行加密解密操作时,基本的数据块长度。在RSA算法中,执行加密和解密操作,输入的数据块长度都必须等于模长,否则算法内部无法处理;即RSA密钥的长度不同,对应输入数据块的长度也是不同的,这一点与DES、AES等对称加密算法是完全不一样的。

假设我们有4个RSA接口

RSA_prikey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);

RSA_prikey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);

RSA_pubkey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);

RSA_pubkey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);

有趣的是,当我们有一段固定的数据in,分别输入RSA_pubkey_encrypt和RSA_pubkey_decrypt接口,得出的out居然是一样的!同样的在类似的私钥接口,也有类似的现象。经过这个实验,我么可以得出结论:根本没有所谓的公钥加密和公钥解密之分,公钥加密就是公钥解密,私钥加密也就是私钥解密;所以我们应该对公钥私钥、加密解密做个统一叫法,应该就是私钥运算和公钥运算。所以以上的接口应改为:

RSA_prikey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);

RSA_pubkey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);

SM2算法

SM2算法是国产的非对称算法,它的诞生就是为了取代RSA算法。SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小。SM2算法和RSA算法比较如下:

  SM2 RSA
算法结构 基本椭圆曲线(ECC) 基于特殊的可逆模幂运算
计算复杂度 完全指数级 亚指数级
存储空间 192-256bit 2048-4096bit
秘钥生成速度 较RSA算法快百倍以上
解密加密速度 较快 一般

SM2算法与RSA算法类型,它也有公钥和私钥之分,它的密钥特点是私钥固定长度32字节,而公钥有x和y两个分量,每个分量都是32字节,总共是64字节。

在执行加密运算时,输入数据块的长度是变长的,而加密后的密文长度等于输入长度+96字节。

在执行签名运算时,输入数据块的长度也是变长的,但签名后的数据长度则固定为64字节。

限于篇幅原因,后续再写专门的文章来介绍SM2算法。


非对称加密算法的应用场景


值得注意的是,数据加解密的过程中,虽然公钥和私钥都可以用于加密,也都可以用于解密,并没有严格的限制;但是,在实际的应用中,通常有:

私钥加密,公钥解密:通常应用有签名、验签,即产生签名的一方使用自己的私钥对数据进行签名操作,而验签签名数据是否合法的一方使用签名方的公钥对签名数据进行验签;所以这里可以简单地认为,签名就是私钥加密,验签就是公钥解密。

公钥解密,私钥解密:通常应用在对数据的加密传输,即加密方使用解密方的公钥做加密动作,这样就意味着这段加密数据只有解密方一人能解开,因为解密方的私钥是不公开的,只有它自己知道,这样就可以很好地保证的加密数据的安全性。


此次关于非对称加密算法的介绍,就到此结束,如果需要学习更多有关非对称加密算法的知识,可以自行深入学习RSA算法和SM2算法的更多算法细节,相信你一定有更多的收获。后续会有详细介绍非对称算法在实际应用场景的文章,敬请关注,谢谢。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分