我正在努力解密使用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 ==
非常感谢任何帮助。
答案 0 :(得分:0)
各种各样的建议和想法:
答案 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的倍数进行解密。