本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。也可以查看《GmSSL国密加密算法库使用系列教程》。
常见的加密算法可以分成三类,对称加密算法、非对称加密算法、Hash算法。
一、对称加密算法
对称加密是使用同一个密钥对信息进行加解密。
这就类似于,我们对一个压缩包进行加密时输入一个密码,那么我们在解密时输入同一个密码进行解密,一个道理。
加密过程:明文+密钥a,进行加密,输出密文。
解密过程:密文+密钥a,进行解密,输出明文。
另外在多方通信中,密钥的管理也会非常的麻烦。在数据传送前,发送方和接收方必须商定好密钥,然后使双方都能保存好密钥。其次如果一方的密钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘密钥,也就是说每一组收发方所使用的密钥都是唯一的,例如:A电脑与B、C、D都有通信,那么A就得存储与B、C、D三台电脑通信所用的密钥。这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
小结:
优点:速度快,适合加密大量数据。
缺点:密钥的传递存在着安全隐患,若在网络上传输,密钥泄露,则消息内容泄露。
常见算法:AES、DES、3DES,国密SM4
二、非对称加密算法
1. 公钥加密,私钥解密
可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。
与对称加密算法不同,是由一对密钥来进行加解密的过程,分别称为公钥和私钥。
两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。
一般有如下2种用法:
- 公钥加密,私钥解密。
- 私钥加密,公钥解密。
即如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;
如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
从理论上讲,生成的公钥和私钥是对等的,只是两个数而已。把它们哪个公开出去用于加密,哪个保留起来用于解密,都是一样的。
但是严格地讲,“私钥加密,公钥解密”这种说法是错误的。实际上,公钥和私钥在安全等方面,有完全不同的要求。
故,我们常用的用法是:公钥加密,私钥解密。
通常个人保存私钥,公钥是公开的(可能同时多人持有)。如下所示:
公开的公钥,可以被多人(B、C、D)用于数据加密,生成的密文,只能由对应的私钥进行解密,而私钥只有A知道,我们可以通过网络传递公钥,但私钥从始至终没有传递,所以在安全性上避免了私钥泄露导致数据泄露。
小结:
优点:非对称加密与对称加密相比,其安全性更好,可以避免秘钥在传递过程中泄露。
缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
算法过程:B是发送方,A是接收方,A、B都有各自的公钥和私钥,B使用A的公钥对信息进行加密传输,A收到密文后使用A的私钥解开。
快记法则:公钥加密,私钥解密。
常见算法:RSA、ECC,国密SM2
2. 数字签名防止信息被篡改
上述非对称加密方式看起来,安全性上似乎完美。但是实际上存在一个问题。
我们还是以上图为例子,进行说明。
公钥是公开的,任何人可以获取,那就意味着,除了B、C、D以外的其他人,可以轻易拿到公钥。
那么假设是在战场场景下,别有用心的人就可以利用公钥将假指令进行加密,传递给A,虽然B、C、D传递的消息没有泄露,但是却不能避免,别人篡改消息,A就不知道收到的消息到底是真还是假。
所以,在非对称加密的基础进行了改进,解决密文在传输过程中可能会被篡改的问题。
那就是对消息内容进行数字签名,证明这个数据的来源是B/C/D。
(1)数字签名
数字签名的过程,如下图所示:
可以与第1小节中图所示对比,可以发现,B使用A的公钥加密数据前,增加了签名的步骤,将摘要信息用发送者B的私钥加密,与原始数据m一起,再使用接收者A的公钥进行二次加密,将密文传送给接收者。
在进行数字签名时,我们常使用的是 私钥签名,公钥验签。
即用私钥对摘要信息进行加密,用对应的公钥进行解密,得到摘要信息。
注意与上一章节中“公钥加密,私钥解密”使用场景进行区别。
注意:
签名:等同于加密;验签:等同于解密。
摘要信息的计算,在下一章节,将会介绍,此处只需要知道就是计算算法就行。
(2)验签
验签的过程,如下图所示:
接收者A首先使用自己的私钥,对密文进行解密,得到签名+数据m,然后使用发送者B的公钥,对签名进行解密,得到摘要1;同时采用相同的摘要计算方式,计算数据m的摘要,得到摘要2。
比较摘要1和摘要2是否相同,如果相同,则说明原始数据m,没有被篡改,这条消息不是伪造的,的确是由B发送。
因为B的私钥,只由B自己保管,其他人只有公钥无法正确加密摘要信息。
小结:
快记法则:私钥签名,公钥验签。
数字签名过程:
(1)B生成一对密钥(公钥和私钥),私钥不公开,B自己保留。公钥为公开的,任何人可以获取。
(2)B用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给A。
(3)A收到消息后,在获取B的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是B发送的。
所以在实际应用中,要根据实际情况,也可以同时使用加密和签名,达到既不泄露也不被篡改的效果,更能保证消息的安全性。
三、Hash加密算法(摘要算法)
上文中,我们提到的摘要算法,即此处的Hash算法。
1. 单向算法,密文长度固定
Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。
因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
Hash算法是不可逆的,而其他加密算法是可逆的。
比如,常见的md5,对文件计算md5,可以产生出一个128位(16字节)的散列值(hash value),用于确保文件内容的完整一致性。但是无法由md5值,解密出文件内容。
常见的Hash算法:MD2、MD4、MD5、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1、RIPEMD160,国密SM3
2. 数字签名中使用的Hash算法
在2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
故而,目前,SHA-1是流行的用于创建数字签名的Hash算法。
小贴士:
我不知道,是否上述描述以及图示,会让大家觉得似乎很复杂,但是其实并不是。
图上的部分过程,在OpenSSL中进行了封装,我们调用相关函数会比较简单。
在本文,我们是从基本使用原理上进行介绍。
后续,我们会使用OpenSSL相关加密函数进行实战,再逐步进行介绍。
参考链接:
《【计算机网络】对称加密、非对称加密和Hash加密的介绍和区别》
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。