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