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

时间:2017-08-06 21:02:24

标签: c# php 3des mcrypt-ecb

我需要将一个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的结果不一致。

任何人都可以解释为什么?

感谢。

1 个答案:

答案 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);
}