Home >php教程 >php手册 >PHP与asp.net C#可共用的可逆加密算法

PHP与asp.net C#可共用的可逆加密算法

WBOY
WBOYOriginal
2016-05-25 16:39:541250browse

因为工作需我们需要在php中生成加密然后在asp.net中接受过来的密码再解密,下面我找到一个PHP与asp.net C#可共用的可逆加密算法,有需要了解的同学可参考.

php加密算法,代码如下:

<?php 
class DES 
{ 
    var $key; 
    var $iv; //偏移量 
     
    function DES($key = &#39;11001100&#39;, $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 ( $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} ); 
        //开源代码phprm.com 
        if ($pad > strlen ( $text )) 
            return false; 
        if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad) 
            return false; 
        return substr ( $text, 0, - 1 * $pad ); 
    } 
     
} 
?>
asp.net程序代码,代码如下:
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Security.Cryptography; 
using System.Text; 
namespace WindowsFormsApplication1 
{ 
    /// <summary> 
    /// DES加密解密字符串 
    /// </summary> 
    public class DesEncryption 
    { 
        /// <summary> 
        /// DES加密字符串 
        /// </summary> 
        /// <param name="encryptString">待加密的字符串</param> 
        /// <param name="encryptKey">加密密钥,要求为8位</param> 
        /// <returns>加密成功返回加密后的字符串,失败返回null</returns> 
        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, 0, 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> 
        /// <param name="decryptString">待解密的字符串</param> 
        /// <param name="decryptKey">解密密钥,要求为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, rgbIV), CryptoStreamMode.Write); 
                cStream.Write(inputByteArray, 0, inputByteArray.Length); 
                cStream.FlushFinalBlock(); 
                return Encoding.UTF8.GetString(mStream.ToArray()); 
            } 
            catch 
            { 
                return null; 
            } 
        } 
    } 
}


教程网址:

欢迎收藏∩_∩但请保留本文链接。

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