在对数据进行加解密时,通常将数据按照固定的大小(block size)分成多个组,那么随之就产生了一个问题,如果分到最后一组,不够一个 block size 了,要怎么办?此时就需要进行补齐操作。
我们常用的填充的方式就包括ZeroPadding、PKCS5Padding与PKCS7Padding。
NoPadding
不填充,如果加密內容不是block size整数倍加密则报错。
ZeroBytePadding
所有需要填充的地方都以0填充。
示例如下:Block 大小为 8 Byte,需要填充 4 Byte(以十六进位表示)
DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |

PKCS#7 Padding
每个填充字节的值是用于填充的字节数,若需要填充 N 个字节,每个填充字节值都是 N 。
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
etc.
示例如下:Block 大小为 8 Byte,需要填充 4 Byte(以十六进位表示)

| DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

PKCS#5 Padding
​ PKCS#5 和PKCS#7计算方式都相同,區別是PKCS5 只能用來填充 8 Byte (64bit)的Block。

示例如下:Block 大小主 8 Byte,需要填充 4 Byte(以十六进位表示)

| DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

PKCS7Padding补齐规则:The value of each added byte is the number of bytes that are added, i.e. N bytes, each of value N are added.

举例:

36 位的 UUID,如果按照 block size=16 字节(即 128 比特),那么就需要补齐到 48 位,差 12 个字节。那么最后填充的 12 个字节的内容,都是字节表示的 0x0c(即 12)。

PKCS7Padding,假设每个区块大小为blockSize,分为二种填充情况。

1、已对齐,填充一个长度为blockSize且每个字节均为blockSize的数据。

2、未对齐,需要补充的字节个数为n,则填充一个长度为n且每个字节均为n的数据。

PKCS5Padding是PKCS7Padding的子集,只是块大小固定为8字节。在aes/sm4等加密算法中,密码的最小长度都是16字节(128位),所以,事实上都没PKCS5Padding什么事了,只有在类似RC2 / RC5和 DES/3DES 算法的情況,这些算法 BlockSize=64bits=8bytes算法才有有到PKCS5Padding。

PKCS#5 PKCS#7 差异
最大的差异是要求的BlockSize 不同

PKCS#5只针对8 Byte(BlockSize=8)填充,填充內容为 0x01- 0x08;
PKCS#7是对任意BlockSize填充,其BlockSize範圍是 1-255 Byte。

本文链接地址:https://const.net.cn/687.html

标签: none

添加新评论