文章目录
加密与解密
加密:将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文。
解密:使用密钥及对应的解密算法对密文进行解密,使其恢复成可读明文。
加解密通常需要使明文数据按照一定长度对齐,叫做块大小(BlockSize),例如AES加解密的BlockSize为16字节,RSA加解密的BlockSize等于密钥长度。
如果数据长度无法对齐到要求的长度,就需要使用填充算法,加密前与解密后需要使用相同的填充算法对数据进行填充或解填充。
加密与解密一般需要对数据进行分包,将明文数据分包处理后,使用加密算法对每包数据进行运算,求出密文数据,每包密文数据的长度通常都是等长的,将每包密文依次连接,形成完整的密文数据。
解密时,按照加解密算法对应的包长度,依次将每包密文进行解密运算,拼凑出明文数据。
对称加解密
加密密钥与解密密钥相同的加密算法。
特点:
-
算法公开
-
计算量小
-
速度快,效率高
-
密钥传输与密钥管理麻烦
通常用于对大量数据进行加密,
常用的加密算法:AES、DES。
AES算法
AES算法安全性与密钥长度关联,密钥长度越长,越安全。
AES密钥分为AES128、AES192、AES256。
明文需要被分为固定长度的块进行加密,BlockSize为16字节。
数据如果被损坏,解密能正常运算,但会得到错误的明文。
AES-ECB
-
ECB模式是最简单的AES加密模式
-
使用一个固定长度的密钥
-
固定的明文将会生成固定的密文,如果有两个相同的明文块,则加密结果也相同。
优点
简单,有利于并行计算,误差不会传递。
缺点
安全性低,容易被爆破
** 加密流程**
解密流程
AES-CBC
-
加解密需要使用一个固定长度的密钥
-
加解密需要一个16字节的初始向量
-
相同的明文不会生成相同的密文
优点
安全性比ECB好
缺点
不利于并行计算,误差会被传递,需要保存初始向量IV
加密流程
解密流程
非对称加解密
使用一对唯一的密钥,即公钥与私钥,两个密钥数学相关,通过公开的公钥,无法计算出私钥。
使用私钥加密的信息,可以使用公钥进行解密
使用公钥加密的信息,只能使用私钥进行解密。
应用场景:
A使用公开密钥加密的信息,发送给B,只有拥有私钥的B才能解密,保证了数据的安全性。
B使用私钥加密的数据,发送给A,只有对应的公钥才能解密,保证了数据的合法性。
RSA算法
RSA密钥构成
RSA私钥:公共模数N+私钥指数D。
RSA公钥:公共模数N+公钥指数E。
公钥可从私钥中获取,私钥不能从公钥中获取。
RSA密钥格式
PKCS#1与PKCS#8能够互相转换。
PKCS#1
密钥对的开始部分为:-----BEGIN RSA PRIVATE KEY-----或 -----BEGIN RSA PUBLIC KEY-----。
包含了RSA加密,解密,验签等内容,用于存储RSA密钥
PKCS#8
密钥对的开始部分为:-----BEGIN PRIVATE KEY----- 或 -----BEGIN ENCRYPTED PRIVATE KEY----- 或-----BEGIN PUBLIC KEY-----。
专门用来存储私钥的文件格式,比PKCS#1多了一部分内容存储算法信息,因此能够存储各种算法的私钥。
RSA填充模式
RSA算法填充内容存在于数据前端,而不是数据尾部。
填充方式 | 明文最大输入长度 | 输出 | 特点 |
---|---|---|---|
RSA_NO_PADDING | 与N等长 | 与N等长 | 当输入不足N时,在数据前端填充0。解密后需去除 |
RSA_PKCS1_PADDING | 比N短至少11个字节 | 与N等长 | 当输入不足N时,会填充部分随机数,因此相同明文的密文数据不同。 |
RSA_PKCS1_OAEP_PADDING | 比N短至少41个字节 | 与N等长 | 新的填充方式,安全性更高。 |
RSA密钥长度
RSA512、RSA1024、RSA2048、RSA3072、RSA4096
密钥长度越长,安全性越高,但性能越低。通常使用RSA2048。
密钥长度影响单次加解密的明文或密文长度。
明文长度m必须 0 < m < N。
ED25519算法
一种高速高安全的签名方法。
密钥
公钥与私钥均为32字节长度,签名长度为64字节。
可使用任意的32字节数据作为私钥,一般使用随机数发生器生成。
通过私钥可生成公钥。
特点
-
性能高
-
安全性高,约等价于RSA3000
数据填充规则
ZeroPadding
数据长度不对齐时,在数据段末尾追加0x00,缺少几个字节,就追加几个字节的0x00.
PKCS5Padding
PKCS5是8字节填充的,即填充一定数量的内容,使得成为8的整数倍,而填充的内容取决于需要填充的数目。
例如:
// 原数组
{0x56}
//PKCS5填充
{0x56, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07}
// 原数组
{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}
//PKCS5填充
{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}
如果已经满足了8的整倍数,按照PKCS5的规则,仍然需要在尾部填充8个字节,并且内容是0x08,目的是为了加解密时统一处理填充。
PKCS7Padding
PKCS7与PKCS5的区别在于PKCS5只填充到8字节,而PKCS7可以在1-255之间任意填充。
由于使用PKCS7Padding/PKCS5Padding填充时,最后一个字节肯定为填充数据的长度,所以在解密后可以准确删除填充的数据,而使用ZeroPadding填充时,没办法区分真实数据与填充数据,所以只适合以\0结尾的字符串加解密
单向散列算法(Hash函数)
不可逆的信息摘要算法。
把任意长的输入消息串变化成固定长的输出串的一种函数。一般用于产生消息摘要。
好的散列算法具备的特性:
-
单向性:即不可逆。
-
抗冲突性:即不同的数据产生两个相同散列值的概率很低。
-
雪崩效应:即原数据发生微小变化,会导致散列值发生巨大差异。
常见用途
-
密码保护:将用户密码的散列值保存,只有用户自己知道密码。
-
签名验签:对消息进行签名,接收方进行验签
-
数据秒传:用户上传大文件时,服务端对比已有文件具的散列值,查找是否有相同文件。
信息摘要算法
- MD5:产生出一个16字节的散列值,已经不再安全,需要高安全性的场景不推荐使用。
安全散列算法
SHA224、SHA256、SHA384、SHA512:统称为SHA2。
-
SHA1:产生出一个20字节的散列值,不安全不建议使用
-
SHA224:产生出一个28字节的散列值。
-
SHA256:产生出一个32字节的散列值。
-
SHA384:产生出一个48字节的散列值。
-
SHA512:产生出一个64字节的散列值。
签名与验签
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
发送方对文件签名后生成签名数据,签名数据与原数据一起发送,接收方通过对签名数据与原文件进行验证签名,确保文件的完整性。
签名不会对原文件进行加密,签名是为了保证文件的完整性与合法性
签名
-
将原始数据使用散列算法,求出散列值。
-
使用私钥对散列值进行加密,生成签名数据(散列值密文)。
-
将原数据与签名数据发送给接收方。
验签
-
使用公钥对签名数据进行解密,获取散列值。
-
使用与发送方相同的散列算法,求取数据的散列值。
-
比对求取的散列值与解密获取的散列值,如果一致,则说明数据合法。