加密算法简单了解——HASH、MAC及一些加密模式


主要从几篇文章中学到的:https://zhuanlan.zhihu.com/p/270949014

hash算法

将任意数据都转换成一个固定长度的字符串。通过哈希后的值几乎无法推导出原文(单向,不可逆)。而且两个不同的原文哈希后结果一定不同(唯一性)。

算法公式:

摘要/散列值/指纹 = hash(消息)

# hash:hash算法、摘要算法、单向散列函数等多种称呼
# 消息:输入值
# 摘要/散列值/指纹:输出值

使用场景:

  • 文件对比
    验证两个文件是否一致,通过MD5算法计算MD5值,看两个文件是否一致,如果一致证明同一个文件(高效、唯一特性)。
  • 登录口令
    注册、登录功能,不会直接将用户密码明文入库,一般采用hash(口令+salt)算出摘要值入库,登录的时候也通过hash方式去匹配。

常见hash算法:

分类算法输出值长度输入值最大长度说明
MD5MD5128bit无限制实践中已产生了碰撞,理论上不具备弱抗碰撞性
SHA-1SHA-1160bit2^64 - 1 bit实践中已产生了碰撞
SHA-2SHA-256256bit2^64 - 1 bit安全使用
SHA-2SHA-512512bit2^128 - 1 bit安全使用
SHA-2SHA-224224bit2^64 - 1 bit安全使用
SHA-2SHA-384384bit2^128 - 1 bit安全使用
SHA-3SHA-256256bit2^64 - 1 bit安全使用
SHA-3SHA-512512bit2^128 - 1 bit安全使用
SHA-3SHA-224224bit2^64 - 1 bit安全使用
SHA-3SHA-384384bit2^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值用于传输。

非常好的参考链接:
基础密码学入门:随机数、hash算法、对称加密算法
基础密码学入门: MAC算法、公开密钥算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值