加密的分类

首先我们了解下加密算法的分类:

1、对称加密,加密和解密的密钥相同,这种方式一般速度非常快,适合高频率,大量传输数据的场景。缺点是密钥必须保持保密,一旦有一方密钥泄露,整个系统就不再安全。

2、非对称加密,加密和解密用的密钥是不同的,分为公钥和私钥,一一对应。如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

这种加密方式安全性比较高,因为加解密的密钥不用,即使发送方的密钥泄露,也无法对数据进行解密。缺点是加密和解密花费时间长、速度相对慢。

AES是一种非常常见的对称加密方式。

AES的基本结构

最常见的有AES-128、AES-192和AES-256 3种方案。它们的区别在于密钥长度不同,AES-128的密钥长度为16bytes(128bit / 8),后两者分别为24bytes和32bytes,密钥越长越安全。

AES是一种分组密码,在加密前先把原数据分成组(一段一段的),每组长度均为128bit,每次加密一组数据,直到全部数据都加密完成。

加密模式

分组密码有五种模式:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。

因为前两种比较常用,我们就只来了解下ECB和CBC两种方式。

ECB模式

这种模式是将整个明文分成若干个长度相同的分组,然后对每一小组进行加密,并将加密结果拼接为最终结果。举个例子:

如果原文被分为s1+s2+s3+s4四段,分别加密则得到e1+e2+e3+e4,每段数据的加密都独立进行。这是最简单的方式。

CBC模式

这种模式是先将明文切分成若干个长度相同的分组(与ECB模式一样),首先用初始向量IV与第一组数据进行异或后再进行加密得到e1。再将e1作为初始向量与第二组数据进行异或后再进行加密得到e2,之后不断进行,直到所有数据均加密完成。

可以看到这种加密方式,后面数据段的加密是依赖前置数据的加密结果的,因此有防止篡改的作用,一旦前面的数据被篡改,后面的数据将无法被解密,因此安全性较好。

填充

前面提到了,一个数据分组长度是128bit,那么如果最后一组数不足128bit怎么办呢?那就需要进行填充。

比较常用的填充方式有NoPadding、PaddingMode.Zeros和PKCS5Padding。

NoPadding

不做任何填充,但是要求明文必须是16字节的整数倍。

PaddingMode.Zeros

补0模式,就是将不足的位数以0补齐。比如原数据为{1,2,3,4,5,a,b,c,d,e},则补齐后为{1,2,3,4,5,a,b,c,d,e,0,0,0,0,0,0}

PKCS5Padding

将不足的位数以缺少的位数的数字补齐位数。比如原数据:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补齐后为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}