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


Posted in PHP onJuly 24, 2017

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

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

//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  
}
<?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加密解密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php设计模式 Builder(建造者模式)
Jun 26 PHP
JSON在PHP中的应用介绍
Sep 08 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
php json中文编码为null的解决办法
Dec 14 PHP
[原创]PHP实现SQL语句格式化功能的方法
Jul 28 PHP
PHP自动识别当前使用移动终端
May 21 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 PHP
PHP的介绍以及优势详细分析
Sep 05 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 #PHP
Yii2.0多文件上传实例说明
Jul 24 #PHP
thinkphp分页集成实例
Jul 24 #PHP
PHP 实现页面静态化的几种方法
Jul 23 #PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 #PHP
php魔法函数与魔法常量使用介绍
Jul 23 #PHP
php curl上传、下载、https登陆实现代码
Jul 23 #PHP
You might like
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
python常见数制转换实例分析
2015/05/09 Python
python搭建微信公众平台
2016/02/09 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
python归并排序算法过程实例讲解
2020/11/04 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
servlet面试题
2012/08/20 面试题
好的自荐信的要求
2013/10/30 职场文书
校园招聘策划书
2014/01/09 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
倡议书格式范文
2014/04/14 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
活动简报范文
2015/07/22 职场文书