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 ADODB使用方法集锦
Mar 25 PHP
php中计算时间差的几种方法
Dec 31 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
php警告Creating default object from empty value 问题的解决方法
Apr 02 PHP
php读取csv文件并输出的方法
Mar 14 PHP
PHP6新特性分析
Mar 03 PHP
php微信浏览器分享设置以及回调详解
Aug 01 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
laravel邮件发送的实现代码示例
Jan 31 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中phar包的使用教程
2017/06/14 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
浅析Python中的多进程与多线程的使用
2015/04/07 Python
使用Python编写vim插件的简单示例
2015/04/17 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
技校个人求职信范文
2014/01/25 职场文书
学员自我鉴定
2014/03/19 职场文书
刑事起诉书范文
2015/05/19 职场文书
任长霞观后感
2015/06/16 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python
python库sklearn常用操作
2021/08/23 Python
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
Python  lambda匿名函数和三元运算符
2022/04/19 Python