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之第五天
Oct 09 PHP
php中文本操作的类
Mar 17 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
PHP插件PHPMailer发送邮件功能
Feb 28 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
PHP实现的mysql读写分离操作示例
May 22 PHP
php-fpm中max_children的配置
Mar 15 PHP
Laravel框架中缓存的使用方法分析
Sep 06 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
Jan 04 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 创建标签云函数代码
2010/05/26 PHP
php常用的url处理函数总结
2014/11/19 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
详细介绍Ruby中的正则表达式
2015/04/10 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
空指针到底是什么
2012/08/07 面试题
大学生优秀班干部事迹材料
2014/05/26 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
英文慰问信范文
2015/03/24 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python