DCPcrypt加密在PyCrypto中解密

时间:2012-09-12 01:42:01

标签: python delphi encryption pycrypto

我正在努力解密使用Rijndael使用DCPcrypt加密的数据。我想用Python来解密它,但我遇到了问题。我会提到我并不是特别精通密码(我参加过大学课程,但就是这样)而且我也不是德尔福程序员,所以这也可能会妨碍我破译DCPcrypt正在做的事情的努力。

这是德尔福代码的核心:

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,则使用ECB加密从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 ==

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

各种各样的建议和想法:

  1. 静态IV通常是一种安全风险,因为它们打开了已知明文攻击的大门。
  2. 查看dcpcrypt源,看起来有一种指定IV的方法。是否有任何理由,如果没有其他原因,除了消除错误的IV作为错误来源?
  3. 同样,您可以尝试使用ECB而不是CBC来完全消除IV并分析问题是在IV还是其他地方(密钥,数据或配置)。

答案 1 :(得分:0)

免责声明:我是非常 Python的新手,但试试这个:

尝试更改

key = key[:16]

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

这会给你一个24字节的密钥,我认为应该可以使用。

DCP允许任意长度的密钥,而Crypto坚持使用16,24或32字节的密钥。默认情况下,DCP将使用SHA1生成密钥,该密钥长度为20个字节。基于此DCP使用用于密钥长度< = 24的逻辑并且仅填充密钥而不是密钥长度< = 16的逻辑,这是密钥[:16]具有的效果。

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

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

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

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