DES加解密算法,在C#与PHP中的通用类。
注意:
1、类中的秘钥key跟向量iv,均用的同样的值
2、编码均采用的utf-8
以下为具体代码,可以直接复制去进行实际测试
C#版代码:
- 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;
- //C# 版DES 加解密算法类
- public class Des{
- //加解密密钥
- private static string skey = "12345678";
- #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);
- 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
- #region DESDeCode DES解密
- public static string DESDeCode(string pToDecrypt, string sKey)
- {
- DESCryptoServiceProvider des = new DESCryptoServiceProvider();
- byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
- for (int x = 0; x < pToDecrypt.Length / 2; x++)
- {
- int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
- inputByteArray[x] = (byte)i;
- }
- des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
- des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
- MemoryStream ms = new MemoryStream();
- CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, 0, inputByteArray.Length);
- cs.FlushFinalBlock();
- StringBuilder ret = new StringBuilder();
- return HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));
- }
- #endregion
- }
PHP版代码:
- <?php
- //PHP 版DES 加解密算法类
- class DES {
- var $key;
- var $iv; //偏移量
- function __construct($key) {
- //key长度为8位,例如:1234abcd
- $this->key = $key;
- $this->iv = $key; //默认以$key 作为 iv
- }
- //加密
- 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} );
- if ($pad > strlen ( $text ))
- return false;
- if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
- return false;
- return substr ( $text, 0, - 1 * $pad );
- }
- }
- header("Content-type: text/html; charset=utf-8");
- $key = '12345678';
- $str = 'abc.123';
- $des = new DES($key);
- $str_en_des = $des->encrypt($str); //加密字符串
- $str_de_des = $des->decrypt($str_en_des); //解密字符串
- echo '加密字符串:',$str,'<br>';
- echo '加密秘钥key:',$key,'<br><br>';
- echo '加密后字符串:',$str_en_des,'<br>';
- echo '解密后字符串:',$str_de_des,'<br>';
- ?>