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作为Shell脚本语言使用
Oct 09 PHP
用PHP动态生成虚拟现实VRML网页
Oct 09 PHP
php读取数据库信息的几种方法
May 24 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
Codeigniter购物车类不能添加中文的解决方法
Nov 29 PHP
php中使用url传递数组的方法
Feb 11 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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 开源AJAX框架14种
2009/08/24 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
Python的Tornado框架异步编程入门实例
2015/04/24 Python
常见的python正则用法实例讲解
2016/06/21 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
Django 框架模型操作入门教程
2019/11/05 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
C#笔试题集合
2013/06/21 面试题
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
EJB3推出JPA的原因
2013/10/16 面试题
模具专业毕业生自荐书范文
2014/02/19 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
python数字图像处理:图像的绘制
2022/06/28 Python