Delphi Aes解密函数

Delphi Aes Decrypt function

我有这个 Python 解密函数,我正试图将其转换为 Delphi。

使用AES CFB模式:

def aes_decrypt(data,key,iv):
    ctx = AES.new(key, AES.MODE_CFB, iv=iv, segment_size=128)
    decrypted = ctx.decrypt(data)
    return decrypted

我在 Delphi 7 中使用 Dcpcrypt。 // key 是 Md5 hash(这个 key/IV 只是例子,并不准确)

const
  Key = 'c143vvssaaea933f04e956a3ff5vb562'; 
  iv = 'r4022f4577726207fy0etf4fate2gd44';
    
function aes_decrypt(Data: TBytes; key,iv: string): TBytes;
var
  Cipher: TDCP_rijndael;
  InStrm, OutStrm: TMemoryStream;
begin
  InStrm := TMemoryStream.Create;
  OutStrm := TMemoryStream.Create;
  InStrm.Write(Data[0], Length(Data));
  Cipher := TDCP_rijndael.Create(nil);
  Cipher.BlockSize:=128;
  Cipher.CipherMode:=cmCFB8bit;
  Cipher.Init(Key, 128, @IV);
  Cipher.DecryptStream(InStrm, OutStrm, OutStrm.Size);
  SetLength(Result, Integer(OutStrm.size));
  OutStrm.Seek(0, 0);
  OutStrm.Read(Result[0], Length(Result));
  OutStrm.SaveToFile('decbuf.bin');
  InStrm.Free;
  OutStrm.Free;
  Cipher.Free;
end;

我的 Delphi 代码输出不正确; Python 函数正在返回预期的输出。

segment_size

segment_size (integer) – (Only MODE_CFB).明文和密文分片的位数,必须是8的倍数,不指定则为假定为 8.

这是否适用于 Delphi Dcpcrypt?

我不知道 Python 并且只能假设 OP 正在导入 PyCrypto, but the manual's first example 显示并解释了我怀疑的内容:

key = b'Sixteen byte key'
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)

keyiv都是字节,不是字符串。它甚至字面意思是“十六字节密钥”,而不是“32 个字符的哈希字符串”。文字前面的 b 也不是为了好玩。但是在您的 Pascal 代码中,您要传递的文本令人惊讶地是 16 字节大小的两倍,而且(几乎)只使用十六进制数字。但是你应该提供完整的字节而不是它们的十六进制表示。正确的代码是:

const
  // v, s, r, t and g are invalid digits, of course
  Key= #$c1##$vv#$ss#$aa#$ea##f##$e9##$a3#$ff#v#$b5#;
  iv= #$r4##f######$fy#[=11=]e#$tf#f#$at#$e2#$gd#;

// Last parameter is optional, just like you wanted it. Credits: fpiette
function aes_decrypt( Data: TBytes; key, iv: String; segment_size: Integer= 128 ): TBytes;

剩下的就靠你自己了。给你的评论几乎没有让你进步。 DCPcrypt(就像任何 software/library)存在于不同的版本中,在细节上有所不同——因为没有人知道您使用的是哪一个,没有人可以半途查明您犯的潜在错误。 PyCrypto 也是如此。如果你会马上提供

  • 未经审查的正确密钥,
  • 未经审查的正确初始化向量,
  • 加密数据,以及
  • 正确解密的数据

那就简单多了。否则你可能会永远等待,直到有人出现可以执行两端(Python X 和 Delphi 7)。考虑彻底改变您的问题并提供更多详细信息。