DCPcrypt在PyCryp中的加解密

2024-10-06 13:02:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Rijndael解密用DCPcrypt加密的数据。我想用Python解密,但遇到了问题。我要说的是,我不是特别精通密码(我上过大学课程,但仅此而已),而且我也不是Delphi程序员,所以这可能也阻碍了我破解DCPcrypt到底在做什么的努力。在

这是德尔福代码的核心:

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

因此,实现使用了一个密钥(从password字段中获得),但没有IV。PyCrypto另一方面需要一个IV。搜索DCPcrypt代码的内部,似乎如果IV为零,那么就使用ECB加密从0xff字符串填充IV?在

^{pr2}$

看来我用的是静态静脉注射。但是,我不能使这个工作。这是我在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==

非常感谢任何帮助。在


Tags: thekey代码密码new密钥aescipher
2条回答

免责声明:我对Python非常陌生,但请尝试一下:

试着换衣服

key = key[:16]

^{pr2}$

这将给你一个24字节的密钥,我想应该可以用。在

DCP允许任何长度的密钥,而Crypto则坚持密钥为16、24或32字节。默认情况下,DCP将使用SHA1生成密钥,该密钥的长度为20字节。在此基础上,DCP使用keylength<;=24的逻辑,而不是keylength<;=16的逻辑,而keylength<;=16的逻辑就是key[:16]所起的作用。在

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

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

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

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

各种各样的建议和想法:

  1. 静态IVs通常存在安全风险,因为它们为已知的明文攻击打开了大门。在
  2. 看看dcpcrypt源代码,似乎有一种方法可以指定IV。如果没有其他原因,除了将不正确的IV消除为错误源之外,还有什么理由不这样做呢?在
  3. 同样,您可以尝试使用ECB而不是CBC来完全消除IV,并隔离问题是出在IV还是其他地方(key、data或configuration)。在

相关问题 更多 >