【发布时间】: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,则使用 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==
非常感谢任何帮助。
【问题讨论】:
-
似乎
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