【发布时间】:2020-08-15 16:54:15
【问题描述】:
我正在尝试在 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 方面,我尝试了几个函数来使用相同的密钥('SecretKeySecretKeySecret')加密相同的字符串('test'),但结果与我在 Delphi 中得到的不同。同样,我可以使用类似的功能成功解密 PHP 中的消息,但我需要在 Delphi 中解密消息。
这就是我在 PHP 中所做的,我什至尝试对密钥进行哈希处理,因为我看到 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 是目前我设法让它运行的唯一库。
【问题讨论】:
-
在 Delphi 7 中使用 AnsiString(8 位(ANSI)字符)。 PHP中使用什么类型的字符串?如果使用 Unicode 字符串,加密的结果会有所不同。
-
@ValMarinov 这是一个很好的建议,但似乎情况并非如此。我在 Delphi 中使用了 UTF8String('test'),它并没有改变结果。然后我在 PHP 中使用了 $text = iconv("UTF-8", "Windows-1252", "test") 并且没有任何变化。我什至在 Delphi 和 PHP 中都转换了密钥,但我得到了相同的结果。
-
看起来不像那些函数会做同样的事情。为什么您决定以这种方式编写代码,或者您只是从一些在线资源中复制代码而没有真正了解所有含义?