分组加密中的填充介绍(PKCS1Padding / PKCS5Padding/ISO10126Padding)
在玩Cipher的时候,其中创建Cipher对象的时候需要指定加密模式,指定为对称加密中的分组算法时,因为加密是以 块 为单位进行一次加密,所以要求数据是块的整数倍,如果不符合要求,则需要进行填充
Public Key Cryptography Standards, PKCS,公钥加密标准,是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议
常见的填充方式有以下几种:(例如块大小为 8bytes,数据不足,需要填充)
1、 填充数据为填充字节的长度
这种填充方式中,填充的所有字节值都为需要填充字节的长度
例如:现在有3bytes,块大小为8bytes,需要填充5bytes,即以5来填充
原数据:66 6F 72
填充后的数据:66 6F 72 05 05 05 05 05
2、 填充数据为0x80后加0x00
这种填充方式中,填充字符串的第一个字节数是0x80,后面的每个字节是0x00
假如:现在有3bytes,块大小为8bytes,需要填充5bytes,则第一个为 80,后面的全部为 00
原数据:66 6F 72
填充后的数据:66 6F 72 80 00 00 00 00
3、填充数据的最后一个字节为填充字节序列的长度
这种填充方式中,填充字符串的最后一个字节为填充字节的长度, 其它为0×00
假如:现在有3bytes,块大小为8bytes,需要填充5bytes,则最后一个为 05,其他全部为 00
原数据:66 6F 72
填充后的数据:66 6F 72 00 00 00 00 05
4、填充数据为0x00
这种填充方式中,填充的所有字节值都为0x00
假如:现在有3bytes,块大小为8bytes,需要填充5bytes,则填充的全部为 00
原数据:66 6F 72
填充后的数据:66 6F 72 00 00 00 00 00
5、填充数据为空格(0x20)
这种填充方式中,填充的所有字节值都为空格0x20
假如:现在有3bytes,块大小为8bytes,需要填充5bytes,则填充的全部为 20
原数据:66 6F 72
填充后的数据:66 6F 72 20 20 20 20 20
在Cipher选择填充的时候,可选择以下几种:
- ISO10126Padding
- OAEPPadding / OAEPWithAndPadding
- PKCS1Padding / **PKCS5Padding **
- SSL3Padding
1 、ISO10126Padding(最常用)对应上面的 填充数据的最后一个字节为填充字节序列的长度
这种填充方式中,填充字符串的最后一个字节为填充字节的长度, 其它为0×00
假如:现在有3bytes,块大小为8bytes,需要填充5bytes,则最后一个为 05,其他全部为 00
原数据:66 6F 72
填充后的数据:66 6F 72 00 00 00 00 05
2、PKCS5Padding(对称加密最常用):将数据填充到8的倍数,填充数据计算公式是,假如原数据长度为len,利用该方法填充后的长度是 len + (8 - (len % 8)), 填充的数据长度为 8 - (len % 8),块大小固定为8字节,填充方式为上面的 填充数据为填充字节的长度
3、PKCS7Padding(对称加密最常用):假设需要填充n (n>0) 个字节才对齐,填充n个字节,每个字节都是n ;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小;PKCS7填充字节的范围在 **1-255 **之间 ,填充方式为上面的 填充数据为填充字节的长度
4、PKCS1Padding (RSA加密最常用)
PKCS#1(v1.5)中规定,如果使用PKCS1Padding进行填充,当RSA的密钥长度是1024b,则原文数据最多117B。若原数据不满足长度要求,则需要在加密前进行填充,填充公式为:
EB = 00 || BT || PS || 00 || D :
- EB :填充后的数据
- D :原消息数据
- BT:The block type 块类型,取值为 00 or 01 (私钥运算时),取值为 02 (公钥运算时)
- PS:The padding string填充字符串,长度为 Len(EB) - 3 - Len(D),最少是 8字节。
- BT=00,PS为00
- BT=01,PS为FF
- BT=02,PS为伪随机生成,非零
5、OAEPPadding:与PKCS1Padding类似,但是数据加密前的编码方式不一样
6、SSL3Padding
填充方案与PKCS5Padding类似(但不完全相同),其中填充长度在填充中编码(范围从1到块_长度
其中 sizeof(内容)+ sizeof(MAC)% 块长度 = 0
padding 必须是(block_length-1)字节长