什么是填充
对称密钥加密设计的块密码工作模式要求输入明文长度必须是块长度的整数倍,因此信息必须填充至满足要求。
分组加密模式中,有些情况下无法进行流加密,这个时候就需要对明文数据分组,最后不满足的块长度要求的就要进行填充
对于cbc,ebc是要填充的,cfb,ofb等是不需要填充的
不带模式和填充来获取AES算法的时候,其默认使用ECB/PKCS5Padding。
填充的模式
JCE中AES支持五中模式:CBC,CFB,ECB,OFB,PCBC;支持三种填充:NoPadding,PKCS5Padding,ISO10126Padding。
不支持SSL3Padding。不支持“NONE”模式。
1.位填充
位填充可用于任意大小的信息。
于信息后添加一个“设定”位(“1”),再添加“重设”位(“0”)至要求大小。“重设”位(“0”)的数量取决于信息末尾到块边缘的距离。以比特表示为“1000 ... 0000”。
这个方法可用于填充任何位长度的信息,而不限于整字节长度的信息。比如,一段 23 位的信息可填充 9 位以填满一个 32 位的块:
2.字节填充:字节填充可用于可编码为整数字节大小的信息。
2.1 ANSI X.923 (美国国家标准协会第 X.923 号标准)
例:下例中,块大小为 8 字节,需要填充 4 字节(以十六进制表示)。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
2.2 ISO 10126 (国际标准化组织第 10126 号标准)[编辑]
这种是只是最后一个是需要填充的数据的长度,中间的都是随机数,这样的话加密更加具备迷惑性,这样也导致了如果是加密块整数倍的话需要多出来一个块
例:下例中,块大小为 8 字节,需要填充 4 字节。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
2.3 PKCS7 (公钥密码学标准第 7 号)[编辑]
PKCS#7 定义于 RFC 5652 (征求意见草案第 5652 号)。
以整字节填充。每个填充字节的值是用于填充的字节数,即是说,添加 N 个字节,每个的值都是 N 。 填充的字节数取决于信息末尾到块边缘的距离。
这样如果是整数倍的话也要多加一个块的长度
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
下例中,块大小为 8 字节,需要填充 4 字节。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
2.4 补0
2.5 nopaddig
在java中使用cbc,ebc中如果使用nopadding模式,那么明文的长度必须等于8字节的倍数,否则会报错。
2.6 密文窃取
密文窃取的加密方式,比较复杂一点
密文窃取:把最后一个密文分组传递给ECB模式的密码,并且把它的输出和剩余的明文信息字节(或位)进行异或。
算法/模式/填充 | 16字节加密后数据长度 | 不满16字节加密后长度 |
---|---|---|
AES/CBC/NoPadding | 16 | 不支持 |
AES/CBC/PKCS5Padding | 32 | 16 |
AES/CBC/ISO10126Padding | 32 | 16 |
AES/CFB/NoPadding | 16 | 原始数据长度 |
AES/CFB/PKCS5Padding | 32 | 16 |
AES/CFB/ISO10126Padding | 32 | 16 |
AES/ECB/NoPadding | 16 | 不支持 |
AES/ECB/PKCS5Padding | 32 | 16 |
AES/ECB/ISO10126Padding | 32 | 16 |
AES/OFB/NoPadding | 16 | 原始数据长度 |
AES/OFB/PKCS5Padding | 32 | 16 |
AES/OFB/ISO10126Padding | 32 | 16 |
AES/PCBC/NoPadding | 16 | 不支持 |
AES/PCBC/PKCS5Padding | 32 | 16 |
AES/PCBC/ISO10126Padding | 32 | 16 |
网友评论