• 加密数据的填充方式(Padding)


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

    这种填充方式中,填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。假定块长度为8,原文数据长度9,则填充字节数等于0x07;如果明文数据长度为8的整数倍,则填充字节数为0x08。填充
    字符串如下:
    原文数据
    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

    (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

    (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

    (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

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

    填充标准:

    PKCS5Padding或PKCS7Padding是RSA公司的公钥密码学标准,与填充方式一对应

    PKCS#1(v1.5)中规定当RSA的密钥长度是1024b,如果使用PKCS1Padding填充,则原文数据必须小于117B,即至少8B需要填充。如果原文不满足长度要求,则在加密前需要进行填充。假定原文数据长度为96 B,则填充处理后字符串分别如下:
    原文数据:
    61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70
    71 72 73 74 75 76 77 78 79 7A 30 31 32 33 34 35
    61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70
    71 72 73 74 75 76 77 78 79 7A 30 31 32 33 34 35
    61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70
    71 72 73 74 75 76 77 78 79 7A 30 31 32 33 34 35
    私钥操作,00型,填充后数据:
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70
    ……
    私钥操作,01型,填充后数据:
    00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
    61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70
    ……
    公钥操作,02型,填充后数据:
    00 02 58 DE B9 E7 15 46 16 D9 74 9D EC BE C0 EA
    B5 EC BB B5 0D C4 29 95 6C 18 17 BE 41 57 19 00
    61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70
    ……
    从填充后的数据可以看出,对于00型的私钥操作,要求原文数据必须不能包含0x00,或者知晓数据长度,否则将不能准确移去填充数据。因此在加解密操作中,常使用01型的私钥操作和02型的公钥操作。


    参考文献:

    [1]樊志英. 关于加密数据的填充方式的研究[J]. 现代电子技术,2014,22:20-23.

  • 相关阅读:
    CCS3.3安装常见问题(以合众达的为例)
    typedef unsigned long (__stdcall *THREADFUNC)(void *)
    Prism学习(8)模块间通讯
    Prism学习(6)Shell Region View
    Prism学习(4)弃远就近UnityBootstrapper
    Prism学习(2)初识Unity
    Prism学习(5)Hello Silverlight
    Prism学习(1)前期准备
    Prism学习(7)Commands
    Prism学习(9)阶段性总结
  • 原文地址:https://www.cnblogs.com/maverick-fu/p/4345649.html
Copyright © 2020-2023  润新知