问题描述
我有这个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)
key
和iv
均以字节为单位,而不是字符串。它甚至从字面上说“十六字节密钥”,而不是“ 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)。考虑彻底改变您的问题,并提供更多详细信息。