密码学(1):常见算法分类
叨两句
密码系列文章,是对接第三方接口时接触到加解密,但是知识体系较乱。希望能整理常见证书、密钥、加解密方式这方面知识,用于简单理解和快速区分。
有些缺漏和待补充,后续慢慢完善。有任何问题欢迎提出,便于及时修正
前言
在需要对数据进行加解密或者加验签时,第一步要做的是确认所用的算法。
按照算法的处理方式(除了那些自定义的方式),主要可以分为:摘要算法、对称加密算法、非对称加密算法。
算法使用场景例子:
A和B之间私密通话,但是有窃听者C。1、明文通话:AB的信息可以轻易被C获取、修改和伪装。
2、对称加密通话:AB用同一密钥加解密,只要密钥不泄露,就是安全的。如果泄露了,因为有了密钥,数据很好伪装,和明文通话一样。
3、非对称加密通话:
- 1)A生成一对公私钥,发公钥给B。B也生成一对公私钥,发公钥给A。公钥在这个过程中可以分发给更多人使用,私钥仅生成方保留。
- 2)发信息时,用对方的公钥加密,再用自己的私钥对加密数据进行签名,发送信息。
- 3)接收消息时,用对方的公钥验证签名(确保消息的来源方是对的),再用自己的私钥解密信息。
4、摘要+非对称加密通话:在加密后的信息过大时,因为签名算法十分复杂,直接对加密结果签名很耗时耗力。所以先加密,中间再对加密信息进行摘要,再对摘要结果进行签名。
1.哈希算法(散列算法、摘要算法)
1. 概念
1. Hash算法,翻译为散列算法,音译为哈希算法,也称摘要算法。
2. 用来对任意一组输入数据进行处理,得到一个固定长度摘要的输出。相同的哈希算法,相同的输入会得到相同结果,不同的输入大概率会得到不同结果。
3. 用途:是单向的算法,只能对信息进行加密,却无法解密。一般用于确认数据完整性和防止篡改,例如签名验证、完整性校验、密码存储等。
2.常见类型
算法 | 输出长度(位) | 输出长度(字节) | 分组长度(位) |
---|---|---|---|
MD5 | 128 bit | 16 bytes | |
SHA-1 | 160 bit | 20 bytes | |
RipeMD-160 | 160 bit | 20 bytes | |
SHA-256 | 256 bit | 32 bytes | |
SHA-512 | 512 bit | 64 bytes | |
SM3(杂凑算法) | 256 bit | 32 bytes | 512 bit |
sha1WithRSAEncryption |
SHA-1 、SHA-256等一般也经常简写为sha1、sha256
sha1WithRSAEncryption = RSA-SHA1
3.常见问题:碰撞
- 碰撞。因为摘要本质是将不定集映射到固定长度的有限集合,所以难免会出现不同输入得到相同输出,这个现象就是碰撞。可见,哈希算法输出长度越长,碰撞概率越低。
- 彩虹表破解。
1)因为相同输入对应结果是相同的,可以暴力穷举破解,但是该方法耗时耗力。
2)假设有一张表,存放了常见口令与对应哈希值。如果原始明文是常见口令,很容易通过比对彩虹表哈希值和摘要内容,得到原始信息,这个表就是彩虹表。
3)因此,在用于存放密码哈希值时,可以对原密码加盐,即原密码再加上一串随机数,再对这个值进行哈希,就可以避免用户的常见口令被轻易破解。
2.对称加密算法
1.概念
1. 当某一算法加解密使用的是同一密钥时,则为对称加密算法。
2. 加解密过程是可逆的。需要加解密的人都有同一密钥,所以其中任一使用者的泄露都会导致安全隐患。
3.用途:因为双发密钥一致,一般用于加密。如果用于签名时,因为双方密钥一致,无法区分,如果一定要用于签名,独有性的部分要靠其他的算法。
💡块加密(分组加密):加密算法无法一次性处理过长的明文,这种情况下,将明文以密钥长度分割,分成一个个固定长度的数据组(块),分别进行加密然后组合,该方式即为块加密,也称分组加密。
2.常见类型
算法 | 输出长度(位) | 输出长度(字节) | 分组(密钥)长度 |
---|---|---|---|
AES | 128 bit | 16 bytes | |
DES | 160 bit | 20 bytes | 56 bit |
3DES | 160 bit | 20 bytes | |
SM1(分组加密) | 512 bit | 64 bytes | 128 bit |
SM4(分组加密) | 512 bit | 64 bytes | 128 bit |
3.常见问题
3.非对称算法
1.概念
1.当加解密使用不同的密钥时(但必须是成对的),该算法为非对称算法。
2.公钥加密时,需要用-配对的私钥解密。私钥加签时,需要用配对的公钥验签。一般ab双方要互相生成一套密钥,将公钥发送给对方。
3.用途:加解密、加验签。公钥可分发多用户,主要注意保存私钥。
2.常见类型
算法 | 输出长度(位) | 输出长度(字节) | 密钥长度 |
---|---|---|---|
RSA | 128 | 16 bytes | |
SM2 | 160 | 20 bytes | 256 bit |
3.常见问题
参考链接
1、https://www.liaoxuefeng.com/wiki/1252599548343744/1304227729113121
2、https://www.liaoxuefeng.com/wiki/1022910821149312/1023025778520640
3、https://www.cnblogs.com/coolYuan/p/8630280.html
4、https://zhuanlan.zhihu.com/p/132352160
5、https://segmentfault.com/a/1190000024523772
本文作者:小七闲
本文链接:https://www.cnblogs.com/inkqx/p/17469190.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步