我需要使用3DES在Delphi中加密一个10字节的字符串。
它必须得到与此PHP代码相同的结果:
function encrypt_3DES($message, $key){
$bytes = array(0,0,0,0,0,0,0,0);
$iv = implode(array_map("chr", $bytes));
$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv);
return $ciphertext;
我一直在尝试使用DCPCrypt和LockBox 3进行编码。最终,我放弃了DCPCrypt,因为它已经很久没有更新了,而且我不确定它是否与Delphi 10.1 Berlin兼容,所以我将重点放在了LockBox 3上,但我无法正确加密。
加密密钥是一个24字节的密钥(我有它的base64表示)。我找不到如何使用LockBox的TSymetricKey类创建这样的密钥,并将其传递给Codec.Init方法。因此,我将其放在AnsiString中,并将其设置为密码属性(虽然文档中说有utf8Password,但我找不到它)。
然后有一个名为EncryptAnsiString的方法,但它仍然期望字符串(Delphi 10.1 Berlin上的utf16)而不是AnsiStrings(尽管文档说相反),因此我不惊讶结果与我要找的(在PHP代码片段中加密的相同值)不匹配。
以下是我的Delphi代码:
function Encrypt(Data: AnsiString; LocalKey: AnsiString): AnsiString;
var
BinaryLocalKey: TBytes;
strLocalKey, strTripleDes: AnsiString;
begin
BinaryLocalKey := DecodeBase64(LocalKey);
setString(strLocalKey, PAnsiChar(@BinaryLocalKey[0]), Length(BinaryLocalKey));
Codec1.Rest;
Codec1.Password := strLocalKey;
Codec1.EncryptAnsiString(Data, strTripleDES);
Codec1.Reset;
Result := strTripleDes;
end;
但是这段代码不仅不能得到与PHP代码相同的结果,而且每次调用相同的输入都会返回不同的结果。
注意:Codec1是一个与TCryptographicLibrary组件相关联的组件,其链模式属性设置为CBC*,加密器设置为3DES(键入选项1)。
有人知道如何正确地获得这个3DES加密吗?
谢谢。