如何从 C# 生成与 3DES ECB PHP 兼容的加密字符串



我需要将 3DES 加密字符串从 c# 传递给 php 网页,但我没有运气。

简而言之,我尝试转换的PHP代码是:

$message = $request->get('searchHash');
$searchHash = base64_decode(rawurldecode($message));
$key = $this->container->getParameter("api_encryption_key");
$decrypted = mcrypt_decrypt(MCRYPT_3DES, $key, $searchHash, MCRYPT_MODE_ECB);
//$data = unserialize($decrypted);
$searchString = str_replace("x0", '', $decrypted);

我重新编写为:

using (TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider())
{
byte[] iv0 = { 0, 0, 0, 0, 0, 0, 0, 0 };
byte[] toEncryptArray = Encoding.ASCII.GetBytes(toEncrypt);
tdes.IV = iv0;
tdes.Key = Encoding.ASCII.GetBytes(key);
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.Zeros;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray =
cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);
tdes.Clear();
return resultArray.ToString();
}

但是,C#的结果与PHP的结果不一致。

谁能说明为什么?

谢谢。

您需要在 C# 代码中返回Convert.ToBase64String(resultArray)。返回resultArray.ToString()会给你带来System.Byte[],而不是你所期望的。然后,PHP 代码将失败。

C#:

string toEncrypt = "SecretText";
string key = "SecretKeySecretKeySecret";
using (TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider())
{
byte[] iv0 = { 0, 0, 0, 0, 0, 0, 0, 0 };
byte[] toEncryptArray = Encoding.ASCII.GetBytes(toEncrypt);
tdes.IV = iv0;
tdes.Key = Encoding.ASCII.GetBytes(key);
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.Zeros;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray =
cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);
tdes.Clear();
string s = Convert.ToBase64String(resultArray);
}

.PHP:

<?php
$message = "b9ssRELdtRWVlNuJqaYUrg==";
$searchHash = base64_decode(rawurldecode($message));
$key = "SecretKeySecretKeySecret";
$decrypted = mcrypt_decrypt(MCRYPT_3DES, $key, $searchHash, MCRYPT_MODE_ECB);
//$data = unserialize($decrypted);
$searchString = str_replace("x0", '', $decrypted);
echo $searchString;

最新更新