如何取消 PKCS#7 / PKCS#5 填充?

问题描述 投票:0回答:2

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

解密后,我得到字符串

453947000000197708080808
,而明文应该
4539470000001977
。根据我们的开发团队的说法,明文应该用 PKCS#5 填充来填充。所以我搜索了这个类,但无法让它工作。

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

python encryption cryptography padding
2个回答
3
投票

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

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

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

一般情况下,不需要单独执行取消填充。填充通常是针对 ECB 或 CBC 操作模式“配置”的。一般来说,PKCS#7 取消填充是 ECB 和 CBC 的默认设置(例如在 Java 和 OpenSSL 中)。

如果您想知道,我已经在
Cryptography

上描述了 PKCS#5 和 PKCS#7 填充之间的差异。 这不是纯文本,而是十六进制:4539470000001977

真实文本长度为 8 个字节,当使用 PKCS#5 加密时,会添加另外 8 个字节的填充,因为文本是 8 字节的倍数。

0
投票

PKCS#7 也是如此,在你的情况下它仍然缺少 4 个字节的“08”。

© www.soinside.com 2019 - 2024. All rights reserved.