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和XSL stylesheets转换XML文档
Oct 09 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
Jun 30 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
php使用CURL伪造IP和来源实例详解
Jan 15 PHP
php操作redis缓存方法分享
Jun 03 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
php插入mysql数据返回id的方法
May 31 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
PHP实现的多进程控制demo示例
Jul 22 PHP
php实例化对象的实例方法
Nov 17 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
利用 window_onload 实现select默认选择
2006/10/09 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
JS跨域总结
2012/08/30 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
基于Bootstrap表单验证功能
2017/11/17 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
Python的SQLAlchemy框架使用入门
2015/04/29 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Python实现的端口扫描功能示例
2018/04/08 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python定时关机小脚本
2018/06/20 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
幼儿园元旦活动感言
2014/03/02 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
2016国庆促销广告语
2016/01/28 职场文书
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫