加密算法简单了解——HASH、MAC及一些加密模式
主要从几篇文章中学到的:https://zhuanlan.zhihu.com/p/270949014
hash算法
将任意数据都转换成一个固定长度的字符串。通过哈希后的值几乎无法推导出原文(单向,不可逆)。而且两个不同的原文哈希后结果一定不同(唯一性)。
算法公式:
摘要/散列值/指纹 = hash(消息)
# hash:hash算法、摘要算法、单向散列函数等多种称呼
# 消息:输入值
# 摘要/散列值/指纹:输出值
使用场景:
- 文件对比
验证两个文件是否一致,通过MD5算法计算MD5值,看两个文件是否一致,如果一致证明同一个文件(高效、唯一特性)。 - 登录口令
注册、登录功能,不会直接将用户密码明文入库,一般采用hash(口令+salt)算出摘要值入库,登录的时候也通过hash方式去匹配。
常见hash算法:
分类 | 算法 | 输出值长度 | 输入值最大长度 | 说明 |
---|---|---|---|---|
MD5 | MD5 | 128bit | 无限制 | 实践中已产生了碰撞,理论上不具备弱抗碰撞性 |
SHA-1 | SHA-1 | 160bit | 2^64 - 1 bit | 实践中已产生了碰撞 |
SHA-2 | SHA-256 | 256bit | 2^64 - 1 bit | 安全使用 |
SHA-2 | SHA-512 | 512bit | 2^128 - 1 bit | 安全使用 |
SHA-2 | SHA-224 | 224bit | 2^64 - 1 bit | 安全使用 |
SHA-2 | SHA-384 | 384bit | 2^128 - 1 bit | 安全使用 |
SHA-3 | SHA-256 | 256bit | 2^64 - 1 bit | 安全使用 |
SHA-3 | SHA-512 | 512bit | 2^128 - 1 bit | 安全使用 |
SHA-3 | SHA-224 | 224bit | 2^64 - 1 bit | 安全使用 |
SHA-3 | SHA-384 | 384bit | 2^128 - 1 bit | 安全使用 |
hash算法示意图及缺陷:
只能验证数据的完整性,但是无法保证数据防篡改。
MAC(消息验证码)算法
是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。主要通过异或运算,再配合其他加密算法实现mac值的运算,用于校验。
MAC值一般和原始消息一起传输,原始消息可以选择加密,也可以选择不加密,通信双方会以相同的方式生成MAC值,然后进行比较,一旦两个MAC相同表示验证正确,否则验证失败。
算法公式:
MAC值 = mac(消息+密钥)
MAC算法分类:
分为CBC-MAC算法和HMAC算法。
HMAC(Hash-based Message Authentication Code)算法使用Hash算法作为加密基元,HMAC结合Hash算法有多种变种,例如HMAC-SHA-1、HMAC-SHA-256等。
MAC算法示意图:
MAC算法例子:
java mac pos_pos终端mac国密(sm4)算法(java实现)
将需要加密计算的字符串转换为16进制字符串
例如:
密钥:“12345678901234567890123456789012”
待加密数据(字符串形式):
6000112018111411003020170930101010120171025000755000000005553
转化为16进制:
36303030 31313230 31383131 31343131 30303330 32303137 30393330 31303130 31303132 30313731 30323530 30303735 35303030 30303030 30353535 33
将转换过的16字符串进行补位分组
补位后的数据(补位规则:字符长度%32!=0补位)
36303030 31313230 31383131 31343131 30303330 32303137 30393330 31303130 31303132 30313731 30323530 30303735 35303030 30303030 30353535 33000000
分组后的数据
第 0组明文:36303030 31313230 31383131 31343131
第 1组明文:30303330 32303137 30393330 31303130
第 2组明文:31303132 30313731 30323530 30303735
第 3组明文:35303030 30303030 30353535 33000000
将分组过的字符串数组逐步进行异或运算
异或流程
第 0组明文: 36303030 31313230 31383131 31343131
第 1组明文: 30303330 32303137 30393330 31303130
第 1组异或结果:06000300 03010307 01010201 00040001
第 2组明文:31303132 30313731 30323530 30303735
第 2组异或结果:37303232 33303436 31333731 30343734
第3组明文:35303030 30303030 30353535 33000000
与第2组密文异或:02000202 03000406 01060204 03343734
将最后异或结果转化为16进制字符串
转换为16进制
30323030 30323032 30333030 30343036 30313036 30323034 30333334 33373334
取前16位和后16位,前16位进行sm4加密,加密结果与后16位异或后再加密
前16位
30323030 30323032 30333030 30343036
后16位
30313036 30323034 30333334 33373334
前16位加密结果
B038A2B2 F3FFE3C8 AC60B377 C70C2DB1
与后16位异或结果
80099284 C3CDD3FC 9C538043 F43B1E85
再加密结果
1E80F373 40B0FEE6 2C81F356 AFB20BF1
取前16个字符作为mac值
mac值:1E80F37340B0FEE6
hash与MAC对比
- hash只能验证数据完整性,无法保证数据防篡改,计算过程无密钥参与
- MAC既可以验证数据完整性,也可以验证数据是由原始发送方发出的,计算过程有密钥参与
MAC与对称加密算法组合的一些不同加密模式
Encrypy-and-MAC(E&M)
从图中可以看出,对称加密和MAC计算使用原始明文为输入同时进行,使用同一个密钥,得到密文+MAC值,用于传输。
MAC-then-Encrypt(MtE)
先使用明文+密钥计算MAC值,再将明文+MAC值一起使用密钥加密得到密文用于传输。
Encrypt-then-MAC(EtM)
先使用密钥对明文加密得到密文,然后使用密文+密钥计算MAC值,将密文+MAC值用于传输。