PHP和C#可共用的可逆加密算法详解


Posted in PHP onOctober 26, 2015

在一些项目中要求在php中生成加密,然后在asp.net中接受过来的密码再解密,下面和大家分享一个PHP与asp.net C#可共用的可逆加密算法,感兴趣的可以参考参考。

php加密算法:

<?php
class DES
{
  var $key;
  var $iv; //偏移量
  
  function DES($key = '11001100', $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 );
  }
  
}
?>

asp.net程序代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace WindowsFormsApplication1
{
  /// <summary>
  /// DES加密解密字符串
  /// </summary>
  public class DesEncryption
  {
    /// <summary>
    /// DES加密字符串
    /// </summary>
    /// <param name="encryptString">待加密的字符串</param>
    /// <param name="encryptKey">加密密钥,要求为8位</param>
    /// <returns>加密成功返回加密后的字符串,失败返回null</returns>
    public static string EncryptDES(string encryptString, string encryptKey = "11001100")
    {
      try
      {
        byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(encryptKey.Substring(0, 8));
        byte[] rgbIV = rgbKey;
        byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
        DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
        MemoryStream mStream = new MemoryStream();
        CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
        cStream.Write(inputByteArray, 0, inputByteArray.Length);
        cStream.FlushFinalBlock();
        StringBuilder ret = new StringBuilder();
        foreach (byte b in mStream.ToArray())
        {
          ret.AppendFormat("{0:X2}", b);
        }
        ret.ToString();
        return ret.ToString(); 
      }
      catch
      {
        return null;
      }
    }

    /// <summary>
    /// DES解密字符串
    /// </summary>
    /// <param name="decryptString">待解密的字符串</param>
    /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
    /// <returns>解密成功返回解密后的字符串,失败返回null</returns>
    public static string DecryptDES(string decryptString, string decryptKey = "11001100")
    {
      try
      {
        byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(decryptKey);
        byte[] rgbIV = rgbKey;
        byte[] inputByteArray = new byte[decryptString.Length / 2];
        for (int x = 0; x < decryptString.Length / 2; x++)
        {
          int i = (Convert.ToInt32(decryptString.Substring(x * 2, 2), 16));
          inputByteArray[x] = (byte)i;
        }      
        DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
        MemoryStream mStream = new MemoryStream();
        CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
        cStream.Write(inputByteArray, 0, inputByteArray.Length);
        cStream.FlushFinalBlock();
        return Encoding.UTF8.GetString(mStream.ToArray());
      }
      catch
      {
        return null;
      }
    }
  }
}

以上就是PHP和C#可共用的可逆加密算法,希望对大家的学习有所帮助。

PHP 相关文章推荐
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
几种有用的变型 PHP中循环语句的用法介绍
Jan 30 PHP
如何用php获取程序执行的时间
Jun 09 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 PHP
PHP可变变量学习小结
Nov 29 PHP
ThinkPHP中limit()使用方法详解
Apr 19 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
thinkPHP5分页功能实现方法分析
Oct 25 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 #PHP
php 参数过滤、数据过滤详解
Oct 26 #PHP
php解析url并得到url中的参数及获取url参数的四种方式
Oct 26 #PHP
php实现CSV文件导入和导出
Oct 24 #PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 #PHP
php实现表单多按钮提交action的处理方法
Oct 24 #PHP
一个简单至极的PHP缓存类代码
Oct 23 #PHP
You might like
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
Python标准库defaultdict模块使用示例
2015/04/28 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
python与js主要区别点总结
2020/09/13 Python
Python3获取cookie常用三种方案
2020/10/05 Python
python利用faker库批量生成测试数据
2020/10/15 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
会计专业毕业生求职信分享
2014/01/03 职场文书
大学生职业规划论文
2014/01/11 职场文书
生产部管理制度
2014/01/31 职场文书
项目建议书格式
2014/03/12 职场文书
《开国大典》教学反思
2014/04/19 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python