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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
PHP网站提速三大“软”招
Oct 09 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
PHP header函数分析详解
Aug 06 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
CI(CodeIgniter)框架配置
Jun 10 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
php版微信自定义回复功能示例
Dec 05 PHP
PHP+MySQL实现消息队列的方法分析
May 09 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
smarty section简介与用法分析
2008/10/03 PHP
PHP安全性漫谈
2012/06/28 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
PHP Reflection API详解
2015/05/12 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
PHP 裁剪图片
2021/03/09 PHP
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
Python使用MD5加密字符串示例
2014/08/22 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
django项目搭建与Session使用详解
2018/10/10 Python
Python匿名函数及应用示例
2019/04/09 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
python获取整个网页源码的方法
2020/08/03 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
教师岗位职责范本
2013/12/29 职场文书
食品安全汇报材料
2014/08/18 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
教师旷工检讨书
2015/08/15 职场文书
音乐研修感悟
2015/11/18 职场文书
怎样写好工作计划
2019/04/10 职场文书