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的FTP学习(一)
Oct 09 PHP
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
php读取xml实例代码
Jan 28 PHP
PHPCMS的使用小结
Sep 20 PHP
PHP explode()函数用法、切分字符串
Oct 03 PHP
php快递单号查询接口使用示例
May 05 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
php判断访问IP的方法
Jun 19 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
Oct 20 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 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下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
php 类自动载入的方法
2015/06/03 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
js常用排序实现代码
2010/12/28 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
Python多线程编程简单介绍
2015/04/13 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
Python如何对XML 解析
2020/06/28 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
大学生的网络创业计划书
2013/12/26 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
医药销售自荐书
2014/05/29 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
干部作风建设心得体会
2014/10/22 职场文书
兵马俑导游词
2015/02/02 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
检讨书怎么写
2015/05/07 职场文书