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 相关文章推荐
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
ThinkPHP关联模型操作实例分析
Sep 23 PHP
php实现单链表的实例代码
Mar 22 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
May 27 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
php利用imagemagick实现复古老照片效果实例
Feb 16 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
Sep 04 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 文件上传系统手记
2009/10/26 PHP
详解PHP PDO简单教程
2019/05/28 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
Python中的with...as用法介绍
2015/05/28 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
python 解压pkl文件的方法
2018/10/25 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
python画微信表情符的实例代码
2019/10/09 Python
python中有函数重载吗
2020/05/28 Python
Python多线程正确用法实例解析
2020/05/30 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
银行财务部实习生的自我鉴定
2013/11/27 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
环保宣传标语
2014/06/12 职场文书
2014年稽查工作总结
2014/12/20 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
秋季运动会加油词
2015/07/18 职场文书