php实现和c#一致的DES加密解密实例

时间:2021-10-01 11:04:37

PHP实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用。以下正确代码是我经过苦苦才找到的。希望大家在系统整合时能用的上。

注意:key的长度为8位以内。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//C# 版DES 加解密算法
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;  
public class Des{  
  //加解密密钥
  private static string skey = "12345678";
  //初始化向量
  private static byte[] DESIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; 
  
        #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);  
         
          //建立加密对象的密钥和偏移量  
          //原文使用ASCIIEncoding.ASCII方法的GetBytes方法  
          //使得输入密码必须输入英文文本  
          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 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="pToDecrypt"> 待解密的字符串</param>
        /// <param name="sKey"> 解密密钥,要求为8字节,和加密密钥相同</param>
        /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
        #region DESDeCode DES解密
        public static string DESDeCode(string pToDecrypt, string sKey)
        {
          //  HttpContext.Current.Response.Write(pToDecrypt + "<br>" + sKey);  
          //  HttpContext.Current.Response.End();  
          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 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
class DES
{
  var $key;
  var $iv; //偏移量
   
  function DES( $key, $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} );
    if ($pad > strlen ( $text ))
      return false;
    if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
      return false;
    return substr ( $text, 0, - 1 * $pad );
  }
   
}
?>

以上这篇php实现和c#一致的DES加密解密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。