抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

AES加密是建立在DES加密不能满足破解难度而产生的。
由比利时两位非常著名的密码学家Joan Daemen和Vincent Rijmen设计,
选取了分组长度为128比特,密钥长度为128比特、192比特和256比特的三个版本。

一、加密模式

常见的五种模式

  • CBC,密码分组连接模式(Cipher Block Chaining)
  • CFB,密文反馈模式(Cipher Feedback)
  • CTR,计数器模式(A simplification of OFB)
  • ECB,电子密码本模式(Electronic CodeBook)
  • OFB,输出反馈模式(Output Feedback)

1.CBC模式

CBC模式又称密码分组链接(Cipher-block chaining),CBC模式对每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。

cbc

CBC允许length不是16(128位)的整数倍,不足的部分会用0填充,输出总是16的整数倍。
完成加密或解密后会更新初始化向量IV。
CBC模式相比ECB有更高的保密性,但由于对每个数据块的加密依赖与前一个数据块的加密所以加密无法并行。
与ECB一样在加密前需要对数据进行填充,不是很适合对流数据进行加密。

2.CFB模式

CFB模式又称密文反馈模式(Cipher feedback),与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。

cfb

CFB的加密工作分为两部分:

  1. 将一前段加密得到的密文再加密;
  2. 将第1步加密得到的数据与当前段的明文异或。

由于加密流程和解密流程中被块加密器加密的数据是前一段密文,因此即使明文数据的长度不是加密块大小的整数倍也是不需要填充的,这保证了数据长度在加密前后是相同的。以128位为例,128位的CFB是对前一段数据的密文用块加密器加密后保存在IV中,之后用这128位数据与后面到来的128位数据异或,num用来记录自上次调用加密器后已经处理的数据长度(字节),当num重新变为0的时候就会再调用加密器,即每处理128位调用一次加密器。

CFB128是每处理128位数据调用一次加密器,此外还有两种常用的CFB是CFB8和CFB1,前者每处理8位调用一次加密器,后者每处理1位调用1次加密器,就运算量来讲CFB1是CFB8的8倍,是CFB128的128倍。对于CFB8和CFB1需要将IV作为移位寄存器。这里对这两种变种不再做单独介绍。

3.CTR模式

CTR模式又称计数器模式(A simplification of OFB),该模式不常见。在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。
这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。

ctr

4.ECB模式

ECB模式又称电子密码本模式(Electronic codebook),ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。

ecb

ECB模式由于每块数据的加密是独立的因此加密和解密都可以并行计算,ECB模式最大的缺点是相同的明文块会被加密成相同的密文块,这种方法在某些环境下不能提供严格的数据保密性。
下面的例子显示了ECB在密文中显示平文的模式的程度:该图像的一个位图版本(左图)通过ECB模式可能会被加密成中图,而非ECB模式通常会将其加密成下图:

ecb-demo

5.OFB模式

OFB模式又称输出反馈模式(Output feedback):OFB是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。有没有觉得和CFB的加密非常相似?

ofb

OFB与CFB一样都非常适合对流数据的加密,OFB由于加密和解密都依赖与前一段数据,所以加密和解密都不能并行。

二、填充类型

常见的填充类型

  • No 不填充
  • Zero 0填充
  • ISO10126 末尾填充字节序列的长度,其余字节填充随机数据
  • OAEP
  • PKCS1
  • PKCS5 用缺失字节数补码,最大8bytes,PKCS7子集
  • PKCS7 用缺失字节数补码,最大255bytes
  • SSL3

1.No

数据: FF FF FF FF FF FF FF FF FF
填充: FF FF FF FF FF FF FF FF FF

2.Zero

数据: FF FF FF FF FF FF FF FF FF
填充: FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00

3.ISO10126

数据: FF FF FF FF FF FF FF FF FF
填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07

4.PKCS5/PKCS7

长度9
数据: FF FF FF FF FF FF FF FF FF
填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

长度11
数据: FF FF FF FF FF FF FF FF FF FF FF
填充: FF FF FF FF FF FF FF FF FF FF FF 05 05 05 05 05

长度8,长度恰好是8的倍数时则再补8个字节的0×08
数据: FF FF FF FF FF FF FF FF
填充: FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08

评论