我需要将一个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的结果不一致。
任何人都可以解释为什么?
感谢。
答案 0 :(得分:0)
您需要在C#代码中返回<?php
if($_SERVER['HTTP_REFERER'] == "mysite.xyz"){
// ok, continue to load the page...
}else{
die("not allowed");
}
。返回Convert.ToBase64String(resultArray)
会给您resultArray.ToString()
而不是您期望的内容。然后PHP代码将失败。
C#:
System.Byte[]
PHP:
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);
}