【问题标题】:Encrypt String with 3DES usingDelphi 10.1 Berlin使用 Delphi 10.1 Berlin 使用 3DES 加密字符串
【发布时间】:2016-08-09 10:24:53
【问题描述】:

我需要在 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,但我无法正确加密。

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

然后有一个名为 EncryptAnsiString 的方法,但它再次需要字符串(Delphi 10.1 Berlin 上的 utf16)而不是 AnsiStrings(尽管文档说相反),所以结果与我的结果不匹配我并不感到惊讶正在寻找(在那个 PHP sn-p 上加密的相同值)。

这是我的 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 组件的组件,其属性 ChainMode 设置为 CBC*,Cipher 设置为 3DES(密钥选项 1)

有人知道如何正确获得这种 3DES 加密吗?

谢谢。

【问题讨论】:

  • 为什么使用文本而不是字节?
  • 我看不到如何使用字节设置密钥/密码。但是,是的,我应该能够使用字节而不是字符串进行加密。我试试看,谢谢。
  • 我很确定问题应该是设置密码/密钥,我看不出如何将它们设置为二进制。设置密钥后,我应该能够在内存中解密,但是相当复杂(您需要启动并完成解密并通过 Stream 获取结果),使用 24- 加密 10 字节字符串看起来有点过头了字节键,我只需要这样做。
  • 3DES 不应用于新工作。
  • 由于 TripleDES 块大小为 64 位(8 字节),并且您想加密 10 个字节,因此您必须进行一些填充。而且我在 Delphi 中没有看到 CBC 的选择(顺便说一句,CBC* 是什么?)也没有 IV。

标签: delphi 3des delphi-10.1-berlin lockbox-3


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2019-01-14
    相关资源
    最近更新 更多