Delphi Aes解密功能

问题描述

我有这个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。 //密钥是Md5哈希值(此密钥/ 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(整数)–(仅MODE_CFB)。明文和密文被分割的位数。它必须是8的倍数。如果未指定,则将假定为8。

这在Delphi Dcpcrypt中适用吗?

解决方法

我不了解Python,只能假设OP正在导入PyCrypto,但是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#$43#$vv#$ss#$aa#$ea#$93#$3f#$04#$e9#$56#$a3#$ff#$5v#$b5#$62;
  iv= #$r4#$02#$2f#$45#$77#$72#$62#$07#$fy#$0e#$tf#$4f#$at#$e2#$gd#$44;

// 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 (就像任何软件/库一样)存在于不同的版本中,它们的细节有所不同-因为没人知道您正在使用哪个版本,所以没人会半途查明您可能犯的错误。 PyCrypto 也是如此。如果您愿意马上提供

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

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