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#可共用的可逆加密算法,希望对大家的学习有所帮助。