PHP和C#可共用的可逆加密算法详解

在一些项目中要求在PHP生成加密,然后在asp.net中接受过来的密码再解密,下面和大家分享一个PHP与asp.net C#可共用的可逆加密算法,感兴趣的可以参考参考。

PHP加密算法:

rush:PHP;"> function DES($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 );
}
}

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,$strBin,MCRYPT_DECRYPT,$this->iv );
$str = $this->pkcs5Unpad( $str );
return $str;
}

function hex2bin($hexData) {
$binData = "";
for($i = 0; $i < strlen ( $hexData ); $i += 2) {
$binData .= chr ( hexdec ( substr ( $hexData,$i,2 ) ) );
}
return $binData;
}

function pkcs5Pad($text,$blocksize) {
$pad = $blocksize - (strlen ( $text ) % $blocksize);
return $text . str_repeat ( chr ( $pad ),$pad );
}

function pkcs5Unpad($text) {
$pad = ord ( $text {strlen ( $text ) - 1} );
if ($pad > strlen ( $text ))
return false;
if (strspn ( $text,chr ( $pad ),strlen ( $text ) - $pad ) != $pad)
return false;
return substr ( $text,- 1 * $pad );
}

}
?>

asp.net程序代码

rush:csharp;"> using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text;

namespace WindowsFormsApplication1
{
///


/// DES加密解密字符串
///

public class DesEncryption
{
///
/// DES加密字符串
///

/// <param name="encryptString">待加密的字符串
/// <param name="encryptKey">加密密钥,要求为8位
/// 加密成功返回加密后的字符串,失败返回null
public static string EncryptDES(string encryptString,string encryptKey = "11001100")
{
try
{
byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(encryptKey.Substring(0,8));
byte[] rgbIV = rgbKey;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream,dCSP.CreateEncryptor(rgbKey,rgbIV),CryptoStreamMode.Write);
cStream.Write(inputByteArray,inputByteArray.Length);
cStream.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in mStream.ToArray())
{
ret.AppendFormat("{0:X2}",b);
}
ret.ToString();
return ret.ToString();
}
catch
{
return null;
}
}

/// <summary>
/// DES解密字符串
/// </summary>
/// <p<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>m name="decryptString"&gt;待解密的字符串</param>
/// <p<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>m name="decryptKey"&gt;解密密钥,要求为8位,和加密密钥相同</param>
/// <returns>解密成功返回解密后的字符串,失败返回null</returns>
public static string DecryptDES(string decryptString,string decryptKey = "11001100")
{
  try
  {
    byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(decryptKey);
    byte[] rgbIV = rgbKey;
    byte[] inputByteArray = new byte[decryptString.Length / 2];
    for (int x = 0; x < decryptString.Length / 2; x++)
    {
      int i = (Convert.ToInt32(decryptString.Substring(x * 2,2),16));
      inputByteArray[x] = (byte)i;
    }      
    DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
    MemoryStream mStream = new MemoryStream();
    CryptoStream cStream = new CryptoStream(mStream,DCSP.CreateDecryptor(rgbKey,inputByteArray.Length);
    cStream.FlushFinalBlock();
    return Encoding.UTF8.GetString(mStream.ToArray());
  }
  catch
  {
    return null;
  }
}

}
}

以上就是PHP和C#可共用的可逆加密算法,希望对大家的学习有所帮助。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...