Padding填充以及加密模式概念

        一般情况下,使用不同语言开发的双方只有约定加密模式和明文填充方式,保证字节序列相同,保证秘钥的生成方式与编码相同,使用相同字符编解码方式等,才可以保证加密双方的互通。

      而对数据在加密时进行填充、解密时去填充则是通信双方需要重要考虑的因素。对原文进行填充的主要原因①安全性。可以使 原文可以“伪装”在填充后的数据中,使得攻击者很难找到正真的的原文位置。②块加密算法要求原文数据长度为固定块大小的整数倍,如果加密原文不满足这个条件,则需要在加密前填充原文数据至固定块大小的整数倍。③填充也为发送方和接收方提供了一种标准的形式以约束加密原文的大小。(只有加解密双方都知道填充方式,才知道任何正确移去填充的数据并就行解密)。

常用的填充模式至少有5种,不同的编程语言实现加密时用到的填充多来于这些方式或他们的变化。

1. 常用的填充形式

1. 1 填充数据为填充字节的长度

        这种填充方式中,填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。假定块长度为8,原文数据长度9,则填充字节数等于0x07;如果明文数据长度为8的整数倍,则填充字节数为0x08。(0x代表16进制。

填充字符串如下:

   原文数据1:FF FF FF FF FF FF FF FF FF

填充后数据1:FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

 

   原文数据2:FF FF FF FF FF FF FF FF

填充后数据2:FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08

1.2 填充数据为0x80后加0x00

      这种填充方式中,填充字符串的第一个字节数是0x80,后面的每个字节是0x00。假定块长度为8,原文数据长度为9或者为8的整数倍,则填充字符串如下:

    原文数据1:FF FF FF FF FF FF FF FF FF

填充后数据1:FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00 00

 

   原文数据2:FF FF FF FF FF FF FF FF

填充后数据2:FF FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00

1.3 填充数据的最后一个字节为填充字节序列的长度

      这种填充方式中,填充字符串的最后一个字节为该字节序列的长度而前面的字节可以是0x00,也可以是随机的字节序列。假定块长度为8,原文数据长度为9或者为8的整数倍,则填充字符串如下:

   原文数据1:FF FF FF FF FF FF FF FF FF

填充后数据1:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07

              或

                       FF FF FF FF FF FF FF FF FF 58 B3 98 9B AD F4 07

 

   原文数据2:FF FF FF FF FF FF FF FF

填充后数据2:FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 08

              或

                       FF FF FF FF FF FF FF FF 32 58 B3 98 9B AD F4 08

 

1.4 填充数据为空格

       这种填充方式中,填充字符串的每个字节为空格对应的字节数0x20。假定块长度为8,原文数据长度为9或者为8的整数倍,则填充字符串如下:

   原文数据1:FF FF FF FF FF FF FF FF FF

填充后数据1:FF FF FF FF FF FF FF FF FF 20 20 20 20 20 20 20

 

   原文数据2:FF FF FF FF FF FF FF FF

填充后数据2:FF FF FF FF FF FF FF FF 20 20 20 20 20 20 20 20

1.5 填充数据为0x00

       这 种 填 充 方 式 中 ,填 充 字 符 串 的 每 个 字 节 为0x00。假定块长度为8,原文数据长度为9或者8的整数倍,则填充字符串如下:

   原文数据1:FF FF FF FF FF FF FF FF FF

填充后数据1:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00

   原文数据2:FF FF FF FF FF FF FF FF

填充后数据2:FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00

      在填充方式 4 和方式 5 中,由于缺少填充数据长度的标识信息,如果原文数据的后几个字节本身包括空格或0,将不能够准确移去填充的数据。因此使用这样的填充方式时,对原文数据有一定的要求。

2.常用的填充方式

2.1 ISO10126Padding

         与上面1.3 节的填充方式相对应。

2.2 PKCS5Padding

      PKCS5Padding或PKCS7Padding是RSA公司的公钥密码学标准PKCS #5文档中定义的填充方式,与上面1.1 节中的填充方式相对应。

2.3 PKCS1Padding

PKCS1Padding 是RSA公司的公钥密码学标准PKCS #1文档中定义的填充方式,是RSA 算法实现加密操作常用的填充方式。

        加密块是8 位字节串EB,它由块标记BT、填充块PS和数据D 组成。即EB=00 || BT || PS || 00 || D。其中BT 是一个标记字节,表示加密块的结构。BT 有 3 个值,00、01 和02,其中私钥操作为00 或01,公钥操作为02。PS 为填充数据,对于BT 为00,填充数据为0x00;对于BT 为01,填充为0xFF;对于BT 为02,填充为假散列生成的非0值。

      PKCS#1(v1.5)中规定当RSA的密钥长度是1024b,如果使用PKCS1Padding填充,则原文数据最多117B。如果原文不满足长度要求,则在加密前需要进行填充。

3 块大小设置

       块的大小根据算法需求来决定。

       例如,AES 的数据块是128bits,也就是16B,所以,块的大小是16字节

       例如,DES 的数据块是64bits,也就是8 B,所以,块的大小是8字节

       另外,填充模式一般针对的是块加密模式(分组加密模式),MD5、SHA等散列方式没有填充模式。

 

          常见对称加密模式:电子密码本(Eletronic CoodBook, ECB),密码分组链(Cipher Block Chaining , CBC),密文反馈( Cipher FeedBack , CFB),输出反馈(Output FeedBack , OFB )

        参考:https://blog.csdn.net/shift_wwx/article/details/84256774

 

发布了57 篇原创文章 · 获赞 36 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/hqy1719239337/article/details/98594298