算法种类
根据技术特征,现代密码学可分为三类:
对称算法
说明:加密密钥和解密密钥相同,对明文、密文长度没有限制
子算法:
流密码算法:每次加密或解密一位或一字节的明文或密文
分组密码算法:将明文(密文)分成固定长度的数据块(比特块或字节块),用同一密钥和算法对每一明文(密文)块加密(解密)后得到等长的密文(明文)块,然后将密文(明文)块按照顺序组合起来最终得到密文(明文)
常见算法:
- 流密码算法:RC4
- 分组密码算法:DES、IDEA、RC2、AES、SM4
非对称算法
说明:加密密钥和解密密钥不相同。
公钥加密,私钥解密
私钥加签,公钥验签
常见算法:RSA、DH、DSA、ECDSA、ECC、SM2
摘要算法
说明:把任意长的输入消息数据转化成固定长度的输出数据的一种密码算法,又称散列函数、哈希函数或杂凑函数、单向函数等。摘要算法没有密钥。
常见算法:MD5、SHA1、SM3
实战
对称算法-RC4
说明
- 加密key长度为1byte~256byte
- 加密后的结果为base-16编码的字符串,需进行转换
代码
1 | package main |
结果:可以看到长度是一致的
➜ myproject go run main.go
RC4加密后:4daff0
RC4解密后:RC4
对称算法-AES
说明
- AES是分组密码算法,所以AES的计算包含两部分
- 分组大小:128位
- 密钥大小:128位、192位和256位,三种可选
- AES加密过程是在一个4×4的字节(128位)矩阵上运作,加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤
- AddRoundKey:—矩阵中的每一个字节都与该次回合金钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
- SubBytes:通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
- ShiftRows:将矩阵中的每个横列进行循环式移位。
- MixColumns:使用线性转换来混合每内联的四个字节
工作模式
AES有6种加密模式。ECB模式和CBC模式是最常用的两种模式,代码也只实现这两种。
需要块对对齐(填充)的AES加密模式:ECB、CBC、PCBC,其余模式无需块对齐。
需要初始向量的AES加密模式:除ECB模式外,都需要初始向量。
电子密码本:Electronic Code Book Mode (ECB)
ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。
优点:有利于并行计算;误差不会累计(互不干扰)。
缺点:可能对明文进行主动攻击。
密码分组链接:Cipher Block Chaining Mode (CBC)
CBC模式对于每个待加密的密码块,在加密前会先与前一个密码块的密文异或然后再用加密器加密(图中的圆圈十字符号表示异或操作,下同)。第一个明文块与一个叫初始化向量(IV)的数据块异或。加、解密双方共同知晓密钥和初始化向量才能实现加解密。
优点:安全性比ECB模式高;是SSL的标准。
缺点:数据块之间的加密有依赖关系,因此不能并行计算。
密文反馈:Cipher Feedback Mode (CFB)
CFB 模式是用分组算法实现流算法,明文数据不需要按分组大小对齐。
优点:明文数据不需要按分组大小对齐,即无需填充。
缺点:同CBC模式,无法并行计算。
输出反馈:Output Feedback Mode (OFB)
OFB 模式的过程和CBC模式有点像,但明文数据不需要按分组大小对齐。
优点:明文数据不需要按分组大小对齐,即无需填充。
缺点:同CBC模式,无法并行计算。
计数器模式:Counter Mode (CTR)
CTR模式是在ECB模式的基础上,引入了Nonce随机数和Counter计数器,Nounce随机数和Counter计数器整体可看作计数器,每加密一段明文,计数器向上加一,并且这个计数器都会和初始IV进行连接、加加、异或等运算,然后使用加密器进行加密,最后在和明文异或得到分段密文。
优点:明文数据不需要按分组大小对齐,即无需填充。
缺点:加密方和解密方需要同时维护初始IV、Nonce、Counter。
填充密码分组链接:Propagating Cipher Block Chaining Mode(PCBC)
PCBC模式是CBC模式的改进版,与CBC模式的不同点在于,CBC模式后段明文加密的所需向量是前一段的密文,而PCBC模式后段明文加密所需的向量是前一段明文和密文的异或值。
优点:同CBC模式。
缺点:同CBC模式。
代码
1 | ////////////////////////////////AES |
结果:
➜ myproject go run main.go
原文: AES待加密数据
—————— CBC模式 ——————–
密文(hex): 49c5e79d2c1167345135323346135484a2ad8e591b05b75ac0d5fcc206fdda90
密文(base64): ScXnnSwRZzRRNTIzRhNUhKKtjlkbBbdawNX8wgb92pA=
解密结果: AES待加密数据
—————— ECB模式 ——————–
密文(hex): 74c3a459214e98d6e91ffc4ea291d63ece558f39d07e3f4ade14adbc3486f60f
密文(base64): dMOkWSFOmNbpH/xOopHWPs5VjznQfj9K3hStvDSG9g8=
解密结果: AES待加密数据
非对称算法-RSA
说明
1.加密的明文长度不能超过 RSA密钥的长度,根据填充方案的不同,RSA加密时,对于原文数据的要求
OAEP填充模式: 原文长度 <= 密钥模长 - (2 * 原文的摘要值长度) - 2字节 ,各摘要值长度:
SHA-1: 20字节 SHA-256: 32字节 SHA-384: 48字节 SHA-512: 64字节
PKCA1-V1_5填充模式:原文长度 <= 密钥模长 - 11字节,比如密钥长度1024位(即128字节),明文长度不能超过117=128-11
2.RSA加密内容的长度有限,这是它的算法决定的,所以一般用RSA加密其他算法的密钥,比如用RSA加密AES的密钥,再用AES算法加密明文数据。如果非要加密大量数据,只能将数据分段进行加密。
3.RSA一般还是用来签名比较多,如果只是签名用的话,加密明文的MD5值就可以
4.密文的长度总是密钥的长度的一半
5.RSA签名也需要选择填充方案,如PKCS_V15或PKCS_V21(PSS)
6.RSA签名先计算出消息的消息摘要,然后使用自己的私钥加密消息摘要,所以需要选择计算摘要的算法,如SHA256等
样式
密钥生成有几种方案,我们用openssl生成密钥对,看看公私钥的样式
生成RSA私钥(无加密)
1 | openssl genrsa -out rsa_private.key 2048 |
生成RSA公钥
本质上是从私钥中提取公钥
1 | openssl rsa -in rsa_private.key -pubout -out rsa_public.key |
查看公/私钥明细
1 | openssl rsa -in rsa_private.key -noout -text |
代码
1 | ////////////////////////////////RSA |
结果:
1 | 原文: RSA待加密数据 |
摘要算法-SHA256
说明
摘要算法比对称算法和非对称算法要容易理解。
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。
摘要计算的速度比较快:
以一个60M的文件为测试样本,经过1000次的测试平均值,三种算法的表现为:
MD5算法运行1000次的平均时间为:226ms
SHA1算法运行1000次的平均时间为:308ms
SHA256算法运行1000次的平均时间为:473ms
代码
1 | func SHA256() { |
结果:
原文: sha256待处理数据
sha256摘要数据: 703d4c3b6d0a73831112d78b0369511483f0de671839c79b119a6587394b7237
最后
对于上面的算法只进行了简单介绍,具体的实现逻辑大家可以找资料继续研究。
世界果然是数学的!
计算机追到根上,都是数学!
代码位置为:https://github.com/shidawuhen/asap/blob/master/controller/various/secret.go
资料
- golang rc4加密算法的使用
- 什么是对称加密(对称加密简介)
- Golang里的AES加密、解密
- 高级加密标准(Advanced Encryption Standard,AES)
- 密码学基础:AES加密算法
- AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
- AES加密模式总结
- RSA加密的限制
- golang实现RSA加密解密算法
- RSA算法多种生成公私钥的方式
- RSA密钥证书的生成
- (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
- 关于RSA加密/解密中OAEP填充模式和PKCS1-v1_5填充模式时对于原文数据的要求
- golang语言rsa加解密及签名验签
- RSA签名和验签
- RSA加密、解密、签名、验签(验证签名)&RSA算法原理
- SHA256简介
- 加密算法比较:SHA1,SHA256(SHA2),MD5
- 【Golang】golang实现sha256加密函数