我需要使用 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 上并将它设置在 Password 属性上(虽然文档说有一个 utf8Password 但我找不到它)。
然后有一个名为 EncryptAnsiString 的方法,但它再次需要字符串(Delphi 10.1 Berlin 上的 utf16)而不是 AnsiStrings(尽管文档说相反),所以我对结果与我正在寻找的不匹配并不感到惊讶for(在那个 PHP 片段上加密的相同值)。
这是我的德尔福代码:
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 组件的组件,其属性 ChainMode 设置为 CBC*,Cipher 设置为 3DES(密钥选项 1)
有人知道如何正确获得这种 3DES 加密吗?
谢谢你。