【问题标题】:Paddling DES with Crypto.Cipher / ValueError: Input strings must be a multiple of 8 in length使用 Crypto.Cipher / ValueError 划桨 DES:输入字符串的长度必须是 8 的倍数
【发布时间】:2015-04-20 21:17:28
【问题描述】:

我正在尝试解密 DES 加密的 Bloomberg 文件。

我收到一个“ValueError:输入字符串的长度必须是 8 的倍数” ' 我理解这意味着我需要将数据“填充”到适当的字节大小。在这个正确吗?

如果是这样,我该如何使用 Crypto.Cipher?

f = open(SourcePath+FileName, 'r')
content = f.readlines()
key = b'Eight888'
msg=content[0]
from Crypto.Cipher import DES
decCipher = DES.new(key, DES.MODE_OFB, msg[:DES.block_size])
msgback = decCipher.decrypt(msg[DES.block_size:])

【问题讨论】:

  • 我有你需要开发的代码。如果您仍然需要它,请在此处发送消息。

标签: python padding des bloomberg


【解决方案1】:

您需要确保 msg 的长度是 8 的倍数。不是,只需在其末尾添加一些随机字符即可。

BuckTurgidson cmets 后更新

可以快速测试

if len(msg) % 8 != 0:
    toAdd = 8 - len(msg) % 8
    # add toAdd chars to msg

但这只有在msg 是一个字符串时才有效

该逻辑也适用于二进制缓冲区

【讨论】:

  • 为什么是随机字符而不仅仅是空格?我错过了什么?
  • 我的错。您也可以使用空格。我通常使用随机字符来获得不可预测的模式,但这意味着您知道原始消息的长度,因此当您解密它时,您可以删除添加的字符(我的代码中就是这种情况;)),但空格很好。
  • @Gianuluca。原则上接受你的回答,但实际上没有使用上面的代码。看不到 toAdd = len(msg) - (len(msg)/8)*8 将如何提供正确数量的字符来添加。
  • 您可以重写为toAdd = len(msg)%8,这会导致(作为操作的其余部分)您需要添加的字符数才能使消息的长度为 8 的倍数。
  • 我肯定错过了一些基本的东西:37%8=5 而我们正在寻找的数字是 3 否? Bcs 37+3=40 这是最接近 8 的倍数...
【解决方案2】:

Bloomberg 提供了一个命令行解密工具,我自己在 Java 中实现了解密,我想说这不值得,我们应该继续调用进程进行解密。

您可以找到一个示例 Java 实现 here,尽管我警告您,当解密消息与您正在加载的缓冲区的大小完全相同时,存在一个错误。

【讨论】:

  • 好吧,这是个不幸的消息。我期待它简单而干净。感谢您的反馈。
  • 我使用 C# 和 Java 重新开发了这个命令行。如果您仍然需要在这里发送消息。
猜你喜欢
  • 2018-03-14
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2021-12-20
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多