【问题标题】:DCPcrypt encryption decrypt in PyCryptoPyCrypto中的DCPcrypt加密解密
【发布时间】:2012-09-12 01:42:01
【问题描述】:

我正在使用 Rijndael 解密使用 DCPcrypt 加密的数据。我想用 Python 来解密它,但我遇到了问题。我会提到我并不是特别精通加密货币(我参加了大学课程,但仅此而已)而且我也不是 Delphi 程序员,所以这也可能阻碍了我努力破译 DCPcrypt 正在做什么。

这是 Delphi 代码的核心:

Cipher: TDCP_rijndael;
begin
Cipher:= TDCP_rijndael.Create(nil);
Cipher.InitStr(PasswordField.Text);
Cipher.EncryptCBC(encryptString[1],encryptString[1],Length(encryptString));

所以实现使用密钥(从密码字段获得)但没有 IV。另一方面,PyCrypto 需要 IV。搜索 DCPcrypt 代码的内部,似乎如果 IV 为 nil,则使用 E​​CB 加密从 0xff 字符串填充 IV?

procedure TDCP_rijndael.Init(var Key; Size: longint; IVector: pointer);
....
  if IVector= nil then
  begin
    FillChar(IV,Sizeof(IV),$FF);
    {$IFDEF CFORM}Encrypt(IV,IV){$ELSE}RijndaelEncryptECB(Data,IV,IV){$ENDIF};
    Move(IV,LB,Sizeof(LB));
  end

看来我正在使用静态 IV。但是,我无法完成这项工作。这是我在 PyCrypto 中的实现。任何想法我做错了什么?

key = "password"
s = hashlib.sha1()
s.update(key)
key = s.digest()
key = key[:16]

# Set up the IV, note that in ECB the third parameter to the AES.new function is ignored since ECB doesn't use an IV
ecb = AES.new(key, AES.MODE_ECB, '\xff' * 16)
iv = ecb.encrypt('\xff' * 16)

cipher = AES.new(key, AES.MODE_CFB, iv)
msg = cipher.decrypt(ct[:16])

我有一些使用 Delphi 代码加密然后进行 base64 编码的纯文本。使用的密钥是字符串密码,如上面的硬编码。使用我的实现,我解密了一堆乱码。

k8b+uce5Fkp7Hbk/CaGYcuEWTfxlI05as88lJL0mHmJxLsKWqki2YwiFPU9Rx8qiUC2cvWZrQIONkw==

非常感谢任何帮助。

【问题讨论】:

  • 似乎 InitStr 是相关函数...您确定它使用 SHA-1 哈希的前 16 个字节作为关键数据吗?
  • 了解如何指定IV,以便您控制它。它们在两侧必须相同。另外,请参阅我在 stackoverflow.com/questions/11717471/delphi-encrypt-compendiun-5-2-vs-chilkat-encryption/ 上关于填充的评论
  • @Jan,我想我应该更具体地了解 Delphi 代码。该代码已经编写并投入生产。我没有更改它的选项。否则,我肯定会指定我的 IV。
  • @nneonneo,InitStr 是相关函数,但我认为它在后台调用 Init。我很确定它使用了 SHA1 的前 16 个字节。今晚我会贴出相关代码。
  • 您是否至少有一份 delphi 的副本,以便您可以对等式的两边进行试验?

标签: python delphi encryption pycrypto


【解决方案1】:

各种随机的建议和想法:

  1. 静态 IV 通常存在安全风险,因为它们为已知的明文攻击打开了大门。
  2. 查看 dcpcrypt 源,似乎有一种方法可以指定 IV。除了消除错误的 IV 作为错误源之外,还有什么理由不这样做?
  3. 同样,您可以尝试使用 ECB 而不是 CBC 来完全消除 IV 并确定问题出在 IV 中还是其他地方(密钥、数据或配置)。

【讨论】:

  • 我想我应该更具体地了解 Delphi 代码。该代码已经编写并投入生产。我没有更改它的选项。否则,我肯定会指定我的 IV。我坚持使用编写的 Delphi 代码,必须让 Python 解决它。
  • 我也是这么想的。建议 3 - 尝试暂时切换到 ecb 模式以帮助确定您是否有 IV 问题或密钥(/数据?)问题。
  • 哦,您也可以尝试编写测试代码来驱动 DCPCrypt 端并将 IV 强制为您认为 IV 应该是的值,并在您未设置 IV 时将其与输出进行比较。 Crypto 和 auth 是一个严重的 PITA,因为任何错误都会使一切随机化。您可以做任何小实验来确定任务的哪一边有问题是一件真正的好事。
【解决方案2】:

免责声明:我非常不熟悉 Python,但试试这个:

尝试改变

key = key[:16]

key = key + bytes([0,0,0,0])

这将为您提供一个 24 字节的密钥,我认为它应该可以工作。

DCP 允许任何长度的密钥,而 Crypto 坚持使用 16、24 或 32 字节的密钥。默认情况下,DCP 将使用 SHA1 生成密钥,密钥长度为 20 字节。基于此 DCP 使用 keylength

另外,不知道这是否只是一个错字,但请尝试更改 AES 模式

cipher = AES.new(key, AES.MODE_CFB, iv)

cipher = AES.new(key, AES.MODE_CBC, iv)

这将对您的输入进行解密。但是你需要考虑对原始源文本进行填充,因为 DCP 不填充(我认为),但 Crypto 需要 16 的倍数才能解密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多