【问题标题】:How to unpad PKCS#7 / PKCS#5 padding?如何取消填充 PKCS#7 / PKCS#5 填充?
【发布时间】:2019-01-27 03:01:01
【问题描述】:

我想就使用cryptography.hazmat.primitives.padding.PKCS7 Python 类寻求帮助。

解密后我得到字符串453947000000197708080808,而明文应该4539470000001977。根据我们的开发团队,明文应该使用 PKCS#5 填充。所以我搜索了这个类,但无法让它工作。

我也可以手动完成,方法是取最后 2 位数字,将它们转换为整数,将其乘以 2,然后将字符串从右边删除该数字。但是,我更愿意使用我用于解密的同一包中的函数进行取消填充。

【问题讨论】:

    标签: python encryption cryptography padding


    【解决方案1】:

    您看到的字符是二进制字节的十六进制表示。您所拥有的是具有给定值的 12 个字节,以 4 个字节值 8 结尾。但是,该输出存在一些严重错误:

    • 对于您所期望的 PKCS#7 填充,结果应该是 8 个字节的值 08 或 4 个字节的值 04
    • 对于 8 或 16 字节的分组密码,您希望得到 16 字节的结果;

    因此,我希望您遗漏了 4 个字节的结果。否则解密不会成功:CBC 或 ECB 解密的输入必须是 8 或 16 字节的倍数,否则会产生错误。

    通常不必单独执行取消填充。填充通常为 ECB 或 CBC 操作模式配置。通常,PKCS#7 unpadding 是 ECB 和 CBC 的默认值(例如在 Java 和 OpenSSL 中)。


    如果您想知道,我已经在网站上描述了 PKCS#5 和 PKCS#7 填充 here 之间的区别。

    【讨论】:

    • 您好 Maarten,首先感谢您的及时答复。我可能做错了什么。明天我会在与安全开发人员交谈时来找你。我很可能在解密过程中做错了什么
    • 如果已经配置了 PKCS#7 填充,那么您可能会忽略 finalOperation 方法(无论调用什么)的返回值,并包括完整的缓冲区大小或类似内容。您可能只需要包含缓冲区的x 字节,其中 x 作为结果值返回。祝你好运。
    • 马丁,你是 100% 正确的。我在复制/粘贴过程中犯了一个错误,因为我检查了日志,我看到填充字节的确切数量以及填充“'45394700000019770808080808080808'”中提到的数字我无意中剪切了最后 4 个字节。这就是我无法正确解析它的原因:(谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多