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

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

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

rush:csharp;"> //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<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>的GetBytes<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>   
      //使得输入密码必须输入英文文本   
      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,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> 
    /// <p<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>m name="pToDecrypt"&gt; 待解密的字符串</param> 
    /// <p<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>m name="sKey"&gt; 解密密钥,要求为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,inputByteArray.Length); 
      cs.FlushFinalBlock(); 

      StringBuilder ret = new StringBuilder(); 

      return HttpContext.Current.Server.UrlDecode(Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank" class="keywords">stem</a>.Text.Encoding.Default.GetString(ms.ToArray())); 
    } 

endregion

}

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

}
?>

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用