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 相关文章推荐
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 PHP
Views rows style模板重写代码
May 16 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
php实现统计网站在线人数的方法
May 12 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
PHP对象实例化单例方法
Jan 19 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 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
Terran建筑一览
2020/03/14 星际争霸
Banner程序
2006/10/09 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
探讨Vue.js的组件和模板
2017/10/27 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
Python对列表排序的方法实例分析
2015/05/16 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
python实现祝福弹窗效果
2019/04/07 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
python绘制直方图和密度图的实例
2019/07/08 Python
Pytorch 实现权重初始化
2019/12/31 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
工作年限证明模板
2014/11/01 职场文书
暂停营业通知
2015/04/25 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python