三重加密在PHP和C#中没有产生相同的结果

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了三重加密在PHP和C#中没有产生相同的结果脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
当我用C#加密时,我得到arTdPqWOg6VppOqUD6mGITjb24 x5vJjfAufNQ4DN7rVEtpDmhFnMeJGg4n5y1BN
static void Main(string[] args)
{
    Encoding byteEncoder = Encoding.Default;

    String key = "ShHhd8a08JhJiho98ayslcjh";
    String message = "Let us meet at 9 o'clock at the secret place.";

    String encryption = Encrypt(message,key,false);
    String decryption = Decrypt(encryption,false);

    Console.WriteLine("Message: {0}",message);
    Console.WriteLine("Encryption: {0}",encryption);
    Console.WriteLine("Decryption: {0}",decryption);
}

public static string Encrypt(string toEncrypt,string key,bool usehashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

    if (useHashing)
    {
        MD5CryptoServicePRovider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.COMputeHash(UTF8Encoding.UTF8.GetBytes(key));
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray,toEncryptArray.Length);

    return Convert.ToBase64String(resultArray,resultArray.Length);
}

public static string Decrypt(string toDecrypt,bool useHashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateDecryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray,toEncryptArray.Length);

    return UTF8Encoding.UTF8.GetString(resultArray);
}

当我用PHP加密时,我得到:arTdPqWOg6VppOqUD6mGITjb24 x5vJjfAufNQ4DN7rVEtpDmhFnMVM W / WFlksR

<?PHP
        $key = "ShHhd8a08JhJiho98ayslcjh";
        $input = "Let us meet at 9 o'clock at the secret place.";

        $td = mcrypt_module_oPEn('tripledes','','ecb','');
        $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
        mcrypt_generic_init($td,$key,$iv);
        $encrypted_data = mcrypt_generic($td,$input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);

        echo base64_encode($encrypted_data);
    ?>

我对密码学知之甚少,无法弄清楚原因.有任何想法吗?谢谢.

彼得是对的. PHP只是用零填充,而你在C#代码中使用PKCS#7.这是一些应该正确的代码
function pkcs7_pad($text,$blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad),$pad);
}

$input = pkcs7_pad("Let us meet at 9 o'clock at the secret place.",16);

或者,你应该能够将它放在你的C#代码中:

tdes.Padding = PaddingMode.Zeros;

并且它也有效(虽然稍微不那么安全).

脚本宝典总结

以上是脚本宝典为你收集整理的三重加密在PHP和C#中没有产生相同的结果全部内容,希望文章能够帮你解决三重加密在PHP和C#中没有产生相同的结果所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。