gpt4 book ai didi

delphi - 使用 Delphi 10.1 Berlin 使用 3DES 加密字符串

转载 作者:行者123 更新时间:2023-12-03 15:57:45 26 4
gpt4 key购买 nike

我需要在 Delphi 中使用 3DES 加密一个 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,但我无法正确加密。

加密 key 是一个 24 字节 key (我有它的 Base64 表示形式)。我找不到如何使用 LockBox 的 TSymetricKey 类创建此类 key 并将其传递给 Codec.Init 方法。所以我把它放在 AnsiString 上并将其设置在 Password 属性上(尽管文档说有一个 utf8Password 但我找不到它)。

然后有一个名为 EncryptAnsiString 的方法,但它再次需要字符串(Delphi 10.1 Berlin 上的 utf16)而不是 AnsiStrings(尽管文档说相反),所以我对结果与我的结果不匹配并不感到惊讶正在寻找(在该 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( key 选项 1)

有人知道如何正确获取此 3DES 加密吗?

谢谢。

最佳答案

为每条消息生成一个随机 IV。 IV 的低 8 字节是随机数,高字节为零。这些低 8 个字节被添加到输出之前。

如果您想通过旁路发送 IV,则从标称密文中去除前 8 个字节。

如果您想控制 IV,请使用版本 3.7.0 ( https://github.com/SeanBDurkin/tplockbox )。您需要设置高级选项并实现 OnGetIV 方法。

在密码选择和链模式选择的属性编辑器中呈现的星号 (*) 表示该选择是推荐选择。

关于delphi - 使用 Delphi 10.1 Berlin 使用 3DES 加密字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38848195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com