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(integer(–(仅MODE_CFB(。明文和密文的分段位数。它必须是8的倍数。如果未指定,则假定为8。

这适用于Delphi Dcpcrypt吗?

我不了解Python,只能假设OP正在导入PyCrypto,但手册的第一个示例显示并解释了我的怀疑:

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

keyiv都以字节为单位,而不是字符串。它甚至字面上说";16字节密钥";,而不是";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也是如此。如果你会立即提供

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

那么它会简单得多。否则,你可能会一直等到有人出现,他可以执行两端(PythonX和Delphi7(。考虑彻底改变你的问题,并提供更多细节。

最新更新