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 a simple smtp class
Nov 26 PHP
php 删除无限级目录与文件代码共享
Nov 22 PHP
浅谈discuz密码加密的方式
May 22 PHP
PHP自动重命名文件实现方法
Nov 04 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
PHP实现数组array转换成xml的方法
Jul 19 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
PHP自定义多进制的方法
Nov 03 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 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
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python读取html中指定元素生成excle文件示例
2014/04/03 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
keras.layer.input()用法说明
2020/06/16 Python
python实现AdaBoost算法的示例
2020/10/03 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
阿波罗盒子:Apollo Box
2017/08/14 全球购物
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
js之ajax文件上传
2021/05/13 Javascript
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js