PHP和C#可共用的可逆加密算法详解
在一些项目中要求在php中生成加密,然后在asp.net中接受过来的密码再解密,下面和大家分享一个PHP与asp.netC#可共用的可逆加密算法,感兴趣的可以参考参考。
php加密算法:
<?php classDES { var$key; var$iv;//偏移量 functionDES($key='11001100',$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); } } functionencrypt($str){ //加密,返回大写十六进制字符串 $size=mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC); $str=$this->pkcs5Pad($str,$size); returnstrtoupper(bin2hex(mcrypt_cbc(MCRYPT_DES,$this->key,$str,MCRYPT_ENCRYPT,$this->iv))); } functiondecrypt($str){ //解密 $strBin=$this->hex2bin(strtolower($str)); $str=mcrypt_cbc(MCRYPT_DES,$this->key,$strBin,MCRYPT_DECRYPT,$this->iv); $str=$this->pkcs5Unpad($str); return$str; } functionhex2bin($hexData){ $binData=""; for($i=0;$i<strlen($hexData);$i+=2){ $binData.=chr(hexdec(substr($hexData,$i,2))); } return$binData; } functionpkcs5Pad($text,$blocksize){ $pad=$blocksize-(strlen($text)%$blocksize); return$text.str_repeat(chr($pad),$pad); } functionpkcs5Unpad($text){ $pad=ord($text{strlen($text)-1}); if($pad>strlen($text)) returnfalse; if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad) returnfalse; returnsubstr($text,0,-1*$pad); } } ?>
asp.net程序代码:
usingSystem; usingSystem.Collections.Generic; usingSystem.IO; usingSystem.Linq; usingSystem.Security.Cryptography; usingSystem.Text; namespaceWindowsFormsApplication1 { ///<summary> ///DES加密解密字符串 ///</summary> publicclassDesEncryption { ///<summary> ///DES加密字符串 ///</summary> ///<paramname="encryptString">待加密的字符串</param> ///<paramname="encryptKey">加密密钥,要求为8位</param> ///<returns>加密成功返回加密后的字符串,失败返回null</returns> publicstaticstringEncryptDES(stringencryptString,stringencryptKey="11001100") { try { byte[]rgbKey=ASCIIEncoding.ASCII.GetBytes(encryptKey.Substring(0,8)); byte[]rgbIV=rgbKey; byte[]inputByteArray=Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProviderdCSP=newDESCryptoServiceProvider(); MemoryStreammStream=newMemoryStream(); CryptoStreamcStream=newCryptoStream(mStream,dCSP.CreateEncryptor(rgbKey,rgbIV),CryptoStreamMode.Write); cStream.Write(inputByteArray,0,inputByteArray.Length); cStream.FlushFinalBlock(); StringBuilderret=newStringBuilder(); foreach(bytebinmStream.ToArray()) { ret.AppendFormat("{0:X2}",b); } ret.ToString(); returnret.ToString(); } catch { returnnull; } } ///<summary> ///DES解密字符串 ///</summary> ///<paramname="decryptString">待解密的字符串</param> ///<paramname="decryptKey">解密密钥,要求为8位,和加密密钥相同</param> ///<returns>解密成功返回解密后的字符串,失败返回null</returns> publicstaticstringDecryptDES(stringdecryptString,stringdecryptKey="11001100") { try { byte[]rgbKey=ASCIIEncoding.ASCII.GetBytes(decryptKey); byte[]rgbIV=rgbKey; byte[]inputByteArray=newbyte[decryptString.Length/2]; for(intx=0;x<decryptString.Length/2;x++) { inti=(Convert.ToInt32(decryptString.Substring(x*2,2),16)); inputByteArray[x]=(byte)i; } DESCryptoServiceProviderDCSP=newDESCryptoServiceProvider(); MemoryStreammStream=newMemoryStream(); CryptoStreamcStream=newCryptoStream(mStream,DCSP.CreateDecryptor(rgbKey,rgbIV),CryptoStreamMode.Write); cStream.Write(inputByteArray,0,inputByteArray.Length); cStream.FlushFinalBlock(); returnEncoding.UTF8.GetString(mStream.ToArray()); } catch { returnnull; } } } }
以上就是PHP和C#可共用的可逆加密算法,希望对大家的学习有所帮助。