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
一个高ai的分页函数和一个url函数
Oct 09 PHP
我的论坛源代码(十)
Oct 09 PHP
php 404错误页面实现代码
Jun 22 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
PHP判断变量是否为0的方法
Feb 08 PHP
php实现计数器方法小结
Jan 05 PHP
PHP动态柱状图实现方法
Mar 30 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
Aug 28 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 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中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
python自动化测试实例解析
2014/09/28 Python
python版学生管理系统
2018/01/10 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
如何在Python对Excel进行读取
2020/06/04 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
市场营销大学生职业规划书
2014/02/25 职场文书
捐助倡议书范文
2014/04/15 职场文书
学校师德承诺书
2014/05/23 职场文书
单位在职证明书
2014/09/11 职场文书
公司收款委托书范本
2014/09/20 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技