gpt4 book ai didi

php - 在 Delphi 和 PHP 中使用 "same"方法加密时的不同结果

转载 作者:行者123 更新时间:2023-12-03 19:02:12 25 4
gpt4 key购买 nike

我正在尝试在 Delphi 和 PHP 之间交换加密消息。

在 Delphi 方面,我从这里下载了 DCPcrypt v2 Beta 3:

http://www.cityinthesky.co.uk/opensource/dcpcrypt/

对于加密,我使用此功能:

function TForm1.Encrypt3DES(psData, psKey: string): string;
var
Cipher: TDCP_3des;
begin
Cipher:= TDCP_3des.Create(nil);
Cipher.InitStr(psKey,TDCP_sha256);
result:=Cipher.EncryptString(psData);
Cipher.Burn;
Cipher.Free;
end;

我正在像这样测试它:
ShowMessage(Encrypt3DES('test','SecretKeySecretKeySecret'));

我得到的结果是 Z74E0Q== 我可以用另一个类似的delphi函数成功解密它:
function TForm1.Decrypt3DES(psData, psKey: string): string;
var
Cipher: TDCP_3des;
begin
Cipher:= TDCP_3des.Create(nil);
Cipher.InitStr(psKey, TDCP_sha256);
result:=Cipher.DecryptString(psData);
Cipher.Burn;
Cipher.Free;
end;

在 PHP 方面,我尝试了几个函数来使用相同的 key ('SecretKeySecretKeySecret')加密相同的字符串('test'),但结果与我在 Delphi 中得到的不同。同样,我可以使用类似的功能成功解密 PHP 中的消息,但我需要在 Delphi 中解密消息。

这就是我在 PHP 中所做的,我什至尝试对 key 进行哈希处理,因为我看到 Delphi 函数正在使用 TDCP_sha256,但结果仍然不同。
$key = "SecretKeySecretKeySecret";

echo base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, 'test', 'ecb')).'<BR><BR>';

echo openssl_encrypt('test', 'des-ede3', $key).'<BR><BR>';

$key = hash('sha256', $key);
echo openssl_encrypt('test', 'des-ede3', $key).'<BR><BR>';

这是结果:

Z05z5Bp4/vY=

L5qmk5nJOzs=

bm7yRdrMs5g=

我究竟做错了什么?顺便说一句,我使用的是 Delphi 7,而 DCPcrypt 是目前我设法让它运行的唯一库。

最佳答案

我认为这会对你有所帮助。 TDCP_3des 是 block 密码,EncryptString方法使用 EncryptCFB8bit方法(使用 CFB(8 位)加密方法加密 size 个字节的数据)。

有两件事很重要:

  • 使用相同的初始化向量
  • 散列 PHP 部分中的键。

  • 德尔福部分:
    function TForm1.Encrypt3DES(psData, psKey: string): string;
    var
    Cipher: TDCP_3des;
    i: integer;
    begin
    Cipher := TDCP_3des.Create(nil);
    try
    Cipher.InitStr(psKey, TDCP_sha256);
    Cipher.SetIV('00000000');
    Result := Cipher.EncryptString(psData);
    Cipher.Burn;
    finally
    Cipher.Free;
    end{try};
    end;

    procedure TForm1.btnEncryptClick(Sender: TObject);
    var
    input, key: string;
    begin
    input := 'Some words in English';
    key := 'SecretKeySecretKeySecret';
    ShowMessage(Encrypt3DES(input, key));
    end;

    PHP部分:
    <?
    $key = "SecretKeySecretKeySecret";
    $key = hash('sha256', $key, true);
    $key = substr($key, 0, 24);
    $iv = '00000000';

    $message = 'Some words in English';
    $result = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CFB, $iv);
    $result = base64_encode($result);
    echo 'Input text: '.$message.'</br>';
    echo 'Encrypted text: '.$result.'</br>';
    ?>

    输出:
    Input:          Some words in English                           
    Encrypted text: hTpdn+USolFTgv/4HnBEvo4scgmp
    Input: This will test Delphi7 and PHP encryption.
    Encrypted text: gik2Iw/m2rtMA9gdKqvFqDg3kuUSb4rnAieyZ8unIvt510Rbt1jLPO+/
    Input: I hope this will work.
    Encrypted text: n/JxW12zORaI7TSCAF4/6cBxqC3mZg==

    备注:

    使用 Delphi 7、DCPcrypt v2、PHP 5.2.10、mcrypt 2.5.7 进行测试。

    关于php - 在 Delphi 和 PHP 中使用 "same"方法加密时的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51184246/

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