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 相关文章推荐
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
一组PHP可逆加密解密算法实例代码
Jan 21 PHP
php判断用户是否关注微信公众号
Jul 22 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
php-app开发接口加密详解
Apr 18 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
php字符串截取函数mb_substr用法实例分析
Jun 25 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
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
CodeIgniter连贯操作的底层原理分析
2016/05/17 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
详解JavaScript正则表达式之分组匹配及反向引用
2016/03/09 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
python实现隐马尔科夫模型HMM
2018/03/25 Python
Python列表解析配合if else的方法
2018/06/23 Python
Flask之flask-session的具体使用
2018/07/26 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python 实现list或string按指定分段
2019/12/25 Python
如何用Python绘制3D柱形图
2020/09/16 Python
浅析Python requests 模块
2020/10/09 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
旷课检讨书2000字
2014/01/14 职场文书
综合实践教学反思
2014/01/31 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
期末评语大全
2014/05/04 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
2014年采购员工作总结
2014/11/18 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js