最近碰到很多加密算法类型的问题,尝试总结一下(大概整理了一下~)
1.单向散列哈希算法
MD5 ,SHA(128、256)系列(信息摘要算法)是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。单向散列函数是一种不可逆的信息摘要算法,无法通过密文还原成明文
应用场景:
![]()
用于密码存储
用于生成信息的摘要,校验数据的完整性:
2.对称加密算法
常见的对称加密算法有 DES、3DES、AES、Blowfish、IDEA、RC5、RC6。由于算法效率较高,一般用于对效率有要求的实时数据加密通信。比如在使用 VPN 或者代理进行 加密通信时,既要保证数据的保密性,又要保证不能有高的延迟,所以通常会使用对称加密算法。
3.非对称加密(RSA算法)
它需要两个密钥,一个是公钥,另一个是私钥,一个用于加密,另一个用于解密。如果其中一个密钥用于加密明文,则原始明文只能用对应的另一个密钥解密;即使最初用于加密明文的密钥也不能用作解密。因为加密和解密需要两个不同的密钥,所以称为非对称加密。
PS:通常情况下,公钥的长度一般比较短,所以我们会将公钥对外公开,让别人使用公钥来加密数据。而我则使用私钥解密数据,但是切记基于非对称的特性,我们也是可以使用公开私钥加密,而使用公钥解密。之所以不这样做仅仅是因为私钥通常比公钥要长,传输起来比较费资源而已。
![]()
对称与非对称的比较:
分析这两种算法的特点可以知道,单纯的使用 对称加密(如:AES) 的来加密两者传输中的数据的时候首先要让双方要知道秘钥是什么,可问题就是这个秘钥的传输是一个问题,直接通过网络传输是极其不安全的。因为网络一旦被监听,这个秘钥就没有存在的意义了,而监听一个网络,难度并不是很大,所以我们不能直接使用 AES 。
再来看非对称加密算法(如:RSA),由于RSA是非对称的加密算法,私钥用来解密,公钥用来加密,公钥之所以带“公”,也是因为其本身就是就需要对外公开的,并不需要保密。这样对于通信双方来说,建立链接之后的第一件事就是双方分发自己的公钥给对方,一端数据传输给对方的时候,先使用接收方发过来的公钥对数据进行加密后再发送,之后接收方会使用自己的私钥解密数据得到明文,然后再使用对方的公钥加密敏感的响应数据,之后再发送给对方,对方拿自己的私钥解密。这样就完成了数据的加密传输通信。
但是有这种加密算法相比 AES 比较耗资源,对于一个访问量比较大的web服务来说,是不推荐的。
为什么对称加密AES比非对称加密RSA快?
基本上来说大致有几点:
-
首先密钥生成肯定较慢,因为rsa密钥出了随机性要求还需要满足数学约束。
-
其次密钥长度不同,同等安全强度下rsa密钥长度远大于aes。另外aes的运算本质上来说就是位移和替换而rsa需要大的模数运算。
-
最后AES方法现今已经有了专门针对其的硬件加速指令,运行速度远远快于RSA
RSA是以幂模运算为基础 c^e mod N。要注意这里面无论是c,e还是N都是数百个二进制位(128/256/512/…)的大数。加密还好说,公钥可以选的比较小,幂指数没那么大。解密的话私钥不可避免是很大的,幂指数大导致幂模很慢。加密解密肯定有一端会比较慢
AES:如果是1024bit的AES,分组可能就是先拆分成16个128-bit AES。AES的基础运算实际有3种,Sbox,XOR以及移位,计算速度快。