PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

ph值是什么意思 TripleDES之C#和PHP之间加密解密

原创
2016-07-28 08:29:56 1045浏览

在C#常用加密解密一文中,介绍了几个加密解密方法,其中有个如何使用对称加密算法DES,此次说下DES的升级版,TripleDES。

DES和TripleDES之间的关系可以参考下面的博文。
对称加密DES和TripleDES

重点内容是,如何分别在C#,PHP中使用TripleDES,然后可以让二者可以解密对方发送的加密内容。

废话不多说,直接上两端的代码。

C#代码

using System;
using System.Security.Cryptography;
using System.Text;

namespace TripleDes
{
    class Program
    {
        staticvoid Main(string[] args)
        {
            //加密的字符串string source = "Happy Father's Day!";

            //用来加密的key 但是最终用在des加密的key//是这个key的 md5 hashstring sourceKey = "home";

            //获取原始key值的 md5 hashbyte[] keyBytes = GetKeyMd5Hash(sourceKey);

            string encryptedStr = DesEncrypt(source, keyBytes);
            Console.WriteLine("encrypted string: "+ encryptedStr);

            string decryptedStr = DesDecrypt(encryptedStr, keyBytes);
            Console.WriteLine("Decrypted String: " + decryptedStr);
            Console.ReadKey();
        }

        ////// 获取加密key的 md5 hash,最终DES加密的时候使用这个hash值//////原始key值///publicstaticbyte[] GetKeyMd5Hash(string key)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            byte[] keyBytes = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();

            return keyBytes;
        }

        ////// TripleDES 加密////////////publicstaticstringDesEncrypt(string toEncrypt, byte[] privateKey)
        {
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider
            {
                Key = privateKey,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };

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

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

        ////// TripleDES解密////////////publicstaticstringDesDecrypt(string toDecrypt, byte[] privateKey)
        {
            //先base64解密 因为加密的时候最后走了一道base64加密byte[] enBytes = Convert.FromBase64String(toDecrypt);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider
            {
                Key = privateKey,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };

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

            return Encoding.UTF8.GetString(resultArray);

        }
    }
}

PHP代码

/*
    TripleDES加密
*/functionDesEncrypt($data)
{//Pad for PKCS7$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = $blockSize - ($len % $blockSize);
    $data .= str_repeat(chr($pad), $pad);

    $key = "home";
    $key = md5($key,TRUE);
    $key .= substr($key,0,8); //comment this if you use 168 bits long key//Encrypt data$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); 
    return base64_encode($encData);
}

 /*
    TripleDES解密
 */functionDesDecrypt($data)
 {$key = "home";
    $key = md5($key, TRUE);
    $key .= substr($key, 0, 8);

    //Decrypt data$fromBase64Str = base64_decode($data);
    $decData = mcrypt_decrypt('tripledes', $key, $fromBase64Str, 'ecb');

    return$decData;
 }

 /*
 测试
 */$encryptStr = DesEncrypt("Happy Father's Day!");     
    echo"encrypted string: $encryptStr";
 $decryptStr = DesDecrypt($encryptStr);
    echo"decrypted string: $decryptStr";
?>

这样以来,PHP就可以解密C#加密后的内容,同样C#也可以解密PHP加密后的内容。

虽然都是TripleDES加密算法,但是因为C#,PHP两种语言加密使用的默认mode,padding都不一样,如果直接使用各自语言自带的TripleDES,会导致双方使用同样的密钥,加密同样的内容后,加密结果不一样,进而就不能相互解密了。

关于各种语言使用的加密模式等内容,可以多多Google。就像RSA加密算法,C#,JAVA,PHP三者使用的密钥格式都不一样,JAVA惯用ASN,C#惯用XML,而PHP惯用PEM。这样就导致各自不能互通。
p.s.还没研究出三者RSA互通的方法。

参考文章:

加密算法模式 填充

PHP padding PKCS7

How to add/remove PKCS7 padding from an AES encrypted string

Triple DES with PCSK7 and ECB between PHP and .NET

今天父亲节,祝老爸节日快乐!

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了ph值是什么意思 TripleDES之C#和PHP之间加密解密,包括了ph值是什么意思方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。