美文网首页
密码学填充方式

密码学填充方式

作者: SilentDawn | 来源:发表于2018-07-19 20:46 被阅读0次

    0 Preface

    在很多密码学加密的情景下,对一块信息进行加密时,要求信息块与密钥的长度相等,而输入的信息又不可能永远保持与密钥长度相等,且如此严重限制了输入信息的自由度,因此需要将信息块补齐到要求的长度。
    在补齐信息块的同时,还需要保证用于补齐的信息可以被很好的理解为是填充块,不影响误读为原始信息块的内容,同时,解密方需要能使用相同的填充方式而不会解析出具有多种可能性的原始信息块,因此需要约定可以唯一辨识原始信息块的填充方式。

    1 位填充

    位填充可用于任意长度的信息。
    在原始信息后添加一个“设定”位(“1”),再添加“重设”位(“0”)至要求的长度。“重设”位(“0”)的数量取决于原始信息末尾到块边缘的距离。其中填充的0的个数可以为0。
    例如:
    一段23位的信息可填充9位以填满一个32位的块

    ... | 1011 1001 1101 0100 0010 0111 0000 0000 |

    位填充在很多哈希函数(例如MD5和SHA)中作为两步填充方案中的第一步。

    2 字节填充

    字节填充可用于可编码为整数字节(一个字节为8位)大小的信息。

    2.1 ANSI X.923

    ANSI X.923,即美国国家标准协会第 X.923 号标准
    例如,块的大小为8字节,需要填充4字节

    ... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |

    那么假设信息块已经满8字节,且块末尾信息恰好符合填充规则,这时块末尾信息是理解为原始信息还是填充信息呢?
    例如

    DD DD DD DD 00 00 00 04中的00 00 00 04既可以理解为原始信息,没有填充,也可以理解为填充信息,这时就产生了歧义。

    因此可以规定无论原始信息的最后一个块是否满8字节,都需要在后面进行填充。所以DD DD DD DD 00 00 00 04中的00 00 00 04只能理解为填充信息,如果原始信息为DD DD DD DD 00 00 00 04,则填充后的结果应该为DD DD DD DD 00 00 00 04 | 00 00 00 00 00 00 00 08。如此便消除了歧义。

    2.2 ISO 10126

    ISO 10126即国际标准化组织第10126号标准。1991年发布,2007年被撤销。
    ISO 10126规定块的最后一个字节写入填充的长度,其他填充位置写入随机数
    例如,块的大小为8字节,需要填充4字节

    ... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |

    该种方式同样会产生2.1章节中的歧义,因此采用2.1章节中相同的方式消除歧义。

    2.3 PKCS #5 & PKCS #7

    即公钥密码学标准第7号
    每个填充字节的值是用于填充的字节的个数,即是说,若需要填充N个字节,则每个填充字节值都是N。填充的字节数取决于算法可以处理的最小数据块的字节数量。
    例如,块大小为8字节,需要填充4字节

    ... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

    那么假设信息块已经满8字节,且块末尾信息恰好符合填充规则,这时块末尾信息是理解为原始信息还是填充信息呢?
    例如

    DD DD DD DD 04 04 04 04中的4个04既可以理解为原始信息就是4个04,没有填充,也可以理解为填充了4个04,这时就产生了歧义。

    该种方式同样会产生2.1章节中的歧义,因此采用2.1章节中相同的方式消除歧义。
    PKCS #5和PKCS #7填充方式相同,但PKCS #5仅为使用64位块大小的块密码定义使用。

    2.4 ISO/IES 7816-4

    ISO/IES 7816-4与位填充的方式相同,在需要填充的第一个位置填充80,之后填充多个00(00的个数可以为0)
    例如

    ... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |

    2.5 补零

    在块的最后填充0以达到块的定长
    例如,块大小为8字节,需要填充4字节

    ... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |

    该方式在原始信息末尾几个字节为00时同样会产生歧义,而且2.1章节中所述的方法无法解决该歧义。但0填充可以应用在从其他方面可以获知原始消息长度的情况下。通常0填充可以应用在二进制编码的字符串中,在字符串中,填充的0作为空字符而不需要显示。

    3 Openssl中的填充方式

    Openssl中的填充方式有以下几种

    • 不填充
    • PKCS #7
    • 0填充
    • ANSI X.923
    • ISO 10126
      其中 PKCS #7是默认的填充方式

    参考文献

    1 Padding (cryptography)

    2 Padding scheme for block ciphers

    3 RFC 5652 Cryptographic Message Syntax (CMS)

    相关文章

      网友评论

          本文标题:密码学填充方式

          本文链接:https://www.haomeiwen.com/subject/addtmftx.html