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 相关文章推荐
Session的工作方式
Oct 09 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
php另类上传图片的方法(PHP用Socket上传图片)
Oct 30 PHP
php利用腾讯ip分享计划获取地理位置示例分享
Jan 20 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
Mar 19 PHP
PHP实现将textarea的值根据回车换行拆分至数组
Jun 10 PHP
thinkPHP5.1框架中Request类四种调用方式示例
Aug 03 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 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操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
python线程中同步锁详解
2018/04/27 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
python和js交互调用的方法
2020/06/23 Python
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
自荐信如何“自荐”
2013/10/24 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
求职信怎么写
2014/05/23 职场文书
预防煤气中毒方案
2014/06/16 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python