- PKCS5:PKCS5是8字节填充的,即填充一定数量的内容,使得成为8的整数倍,而填充的内容取决于需要填充的数目。例如,串
0x56
在经过PKCS5填充之后会成为0x56 0x07 0x07 0x07 0x07 0x07 0x07 0x07
因为需要填充7字节,因此填充的内容就是7。当然特殊情况下,如果已经满足了8的整倍数,按照PKCS5的规则,仍然需要在尾部填充8个字节,并且内容是0x08
,目的是为了加解密时统一处理填充。 - PKCS7:PKCS7与PKCS5的区别在于PKCS5只填充到8字节,而PKCS7可以在1-255之间任意填充。
- PKCS1:在进行RSA运算时需要将源数据D转化为Encryption block(EB)。其中pkcs1padding V1.5的填充模式按照以下方式进行
(1) EB = 00+BT+PS+00+D
EB:为填充后的16进制加密数据块,长度为1024/8 = 128字节(密钥长度1024位的情况下)
00:开头为00,是一个保留位
BT:用一个字节表示,在目前的版本上,有三个值00、01、02,如果使用公钥操作,BT为02,如果用私钥操作则可能为00或01
PS:填充位,PS = k - 3 - D 个字节,k表示密钥的字节长度,如果我们用1024bit的RSA密钥,k=1024/8=128字节,D表示明文数据D的字节长度,如果BT为00,则PS全部为00,如果BT为01,则PS全部为FF,如果BT为02,PS为随机产生的非0x00的字节数据。
00:在源数据D前一个字节用00表示
D:实际源数据
公式(1)整个EB的长度等于密钥的长度。
注意:对于BT为00的,数据D中的数据就不能以00字节开头,要不然会有歧义,因为这时候你PS填充的也是00,就分不清哪些是填充数据哪些是明文数据了,但如果你的明文数据就是以00字节开头怎么办呢?对于私钥操作,你可以把BT的值设为01,这时PS填充的FF,那么用00字节就可以区分填充数据和明文数据,对于公钥操作,填充的都是非00字节,也能够用00字节区分开。如果你使用私钥加密,建议你BT使用01,保证了安全性。
对于BT为02和01的,要保证PS至少要有八个字节长度
因为EB = 00+BT+PS+00+D = k
所以D <= k - 3 - 8,所以当我们使用128字节密钥对数据进行加密时,明文数据的长度不能超过128 - 11 = 117字节
当RSA要加密数据大于(k-11)字节时怎么办呢?把明文数据按照D的最大长度分块,然后逐块加密,最后把密文拼起来就行。
网友评论