Home  >  Article  >  Backend Development  >  php实现和c#一致的DES加密解密

php实现和c#一致的DES加密解密

WBOY
WBOYOriginal
2016-06-23 13:46:12983browse

php实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用。以下正确代码是我经过苦苦才找到的。希望大家在系统整合时能用的上。
注意:key的长度为8位以内。

//C# 版DES 加解密算法using System;   using System.Data;   using System.Configuration;   using System.Web;   using System.Web.Security;   using System.Web.UI;   using System.Web.UI.WebControls;   using System.Web.UI.WebControls.WebParts;   using System.Web.UI.HtmlControls;   using System.Data.SqlClient;   using System.Security.Cryptography;   using System.IO;   using System.Text;   public class Des{       //加解密密钥    private static  string skey = "12345678";    //初始化向量    private static byte[] DESIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };                   #region DESEnCode DES加密                   public static string DESEnCode(string pToEncrypt, string sKey)                   {                       pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt);                       DESCryptoServiceProvider des = new DESCryptoServiceProvider();                       byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);                                      //建立加密对象的密钥和偏移量                        //原文使用ASCIIEncoding.ASCII方法的GetBytes方法                        //使得输入密码必须输入英文文本                        des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);                       des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);                       MemoryStream ms = new MemoryStream();                       CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);                                      cs.Write(inputByteArray, 0, inputByteArray.Length);                       cs.FlushFinalBlock();                                      StringBuilder ret = new StringBuilder();                       foreach (byte b in ms.ToArray())                       {                           ret.AppendFormat("{0:X2}", b);                       }                       ret.ToString();                       return ret.ToString();                   }                  #endregion                  /// <summary>                ///                 /// </summary>                /// <param name="pToDecrypt"> 待解密的字符串                /// <param name="sKey"> 解密密钥,要求为8字节,和加密密钥相同                /// <returns>解密成功返回解密后的字符串,失败返源串</returns>                #region DESDeCode DES解密                public static string DESDeCode(string pToDecrypt, string sKey)                {                    //    HttpContext.Current.Response.Write(pToDecrypt + "<br>" + sKey);                       //    HttpContext.Current.Response.End();                       DESCryptoServiceProvider des = new DESCryptoServiceProvider();                                 byte[] inputByteArray = new byte[pToDecrypt.Length / 2];                    for (int x = 0; x   <pre name="code" class="sycode"><?phpclass DES{	var $key;	var $iv; //偏移量		function DES( $key, $iv=0 ) {	//key长度8例如:1234abcd		$this->key = $key;		if( $iv == 0 ) {			$this->iv = $key; //默认以$key 作为 iv		} else {			$this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );		}	}		function encrypt($str) {	//加密,返回大写十六进制字符串		$size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );		$str = $this->pkcs5Pad ( $str, $size );		return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );	}		function decrypt($str) {	//解密		$strBin = $this->hex2bin( strtolower( $str ) );		$str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );		$str = $this->pkcs5Unpad( $str );		return $str;	}		function hex2bin($hexData) {		$binData = "";		for($i = 0; $i  strlen ( $text ))			return false;		if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)			return false;		return substr ( $text, 0, - 1 * $pad );	}	}?>



Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn