我正在使用 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==
任何帮助是极大的赞赏。