PHP和.net中des加解密的实现方法


Posted in PHP onFebruary 27, 2013

php5.x版本,要添加php扩展php_mcrypt。

PHP版:

class STD3Des
 {
     private $key = "";
     private $iv = "";     /**
     * 构造,传递二个已经进行base64_encode的KEY与IV
     *
     * @param string $key
     * @param string $iv
     */
     function __construct ($key, $iv)
     {
         if (empty($key) || empty($iv)) {
             echo 'key and iv is not valid';
             exit();
         }
         $this->key = $key;
         $this->iv = $iv;
     }
     /**
     *加密
     * @param <type> $value
     * @return <type>
     */
     public function encrypt ($value)
     {
         $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
         $iv = base64_decode($this->iv);
         $value = $this->PaddingPKCS7($value);
         $key = base64_decode($this->key);
         mcrypt_generic_init($td, $key, $iv);
         $ret = base64_encode(mcrypt_generic($td, $value));
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);
         return $ret;
     }
     /**
     *解密
     * @param <type> $value
     * @return <type>
     */
     public function decrypt ($value)
     {
         $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
         $iv = base64_decode($this->iv);
         $key = base64_decode($this->key);
         mcrypt_generic_init($td, $key, $iv);
         $ret = trim(mdecrypt_generic($td, base64_decode($value)));
         $ret = $this->UnPaddingPKCS7($ret);
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);
         return $ret;
     }
     private function PaddingPKCS7 ($data)
     {
         $block_size = mcrypt_get_block_size('tripledes', 'cbc');
         $padding_char = $block_size - (strlen($data) % $block_size);
         $data .= str_repeat(chr($padding_char), $padding_char);
         return $data;
     }
     private function UnPaddingPKCS7($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);
     }
 }
 
 //使用
 include('STD3Des.class.php');
 $key='abcdefgh';
 $iv='abcdefgh';
 $msg='test string';
 $des=new STD3Des(base64_encode($key),base64_encode($iv));
 $rs1=$des->encrypt($msg);
 echo $rs1.'<br />';
 $rs2=$des->decrypt($rs1);
 echo $rs2;

.net版本

sealed public class CryptoHelper
 {
     /// <summary>
     /// Encrypts the specified input.
     /// </summary>
     /// <param name="input">The input.</param>
     /// <param name="key">key</param>
     /// <param name="iv">iv</param>
     /// <returns></returns>
     public static string EncryptDes(string input, byte[] key, byte[] iv)
     {
         if (input == null || input.Length == 0)
             return String.Empty;         DESCryptoServiceProvider des = new DESCryptoServiceProvider();
         MemoryStream ms = null;
         CryptoStream encStream = null;
         StreamWriter sw = null;
         string result = String.Empty;
         try
         {
             ms = new MemoryStream();
             // Create a CryptoStream using the memory stream and the 
             // CSP DES key.  
             //des.Mode = CipherMode.CBC;
             //des.Padding = PaddingMode.PKCS7;  
             encStream = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
             // Create a StreamWriter to write a string
             // to the stream.
             sw = new StreamWriter(encStream);
             // Write the plaintext to the stream.
             sw.Write(input);
             sw.Flush();
             encStream.FlushFinalBlock();
             ms.Flush();
 
             result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length, CultureInfo.InvariantCulture));
         }
         finally
         {
             //close objects
             if (sw != null)
                 sw.Close();
             if (encStream != null)
                 encStream.Close();
             if (ms != null)
                 ms.Close();
         }
         // Return the encrypted string
         return result;
     }
     /// <summary>
     /// Decrypts the specified input.
     /// </summary>
     /// <param name="input">the input.</param>
     /// <param name="key">key</param>
     /// <param name="iv">iv</param>
     /// <returns></returns>
     public static string DecryptDes(string input, byte[] key, byte[] iv)
     {
         byte[] buffer;
         try { buffer = Convert.FromBase64String(input); }
         catch (System.ArgumentNullException) { return String.Empty; }
         // length is zero, or not an even multiple of four (plus a few other cases)
         catch (System.FormatException) { return String.Empty; }
         DESCryptoServiceProvider des = new DESCryptoServiceProvider();
         MemoryStream ms = null;
         CryptoStream encStream = null;
         StreamReader sr = null;
         string result = String.Empty;
         try
         {
             ms = new MemoryStream(buffer);
             // Create a CryptoStream using the memory stream and the 
             // CSP DES key. 
             encStream = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);
             // Create a StreamReader for reading the stream.
             sr = new StreamReader(encStream);
             // Read the stream as a string.
             result = sr.ReadToEnd();
         }
         finally
         {
             //close objects
             if (sr != null)
                 sr.Close();
             if (encStream != null)
                 encStream.Close();
             if (ms != null)
                 ms.Close();
         }
         return result;
     }
 }
 
 //调用
 string key = "abcdefgh";
 string iv = "abcdefgh";
 string msg="test string";
 string rs1 = CryptoHelper.EncryptDes(msg, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));
 string rs2 = CryptoHelper.DecryptDes(rs1, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));
PHP 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
实用函数10
Nov 08 PHP
php FPDF类库应用实现代码
Mar 20 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
May 06 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 #PHP
php数组的概述及分类与声明代码演示
Feb 26 #PHP
浅谈apache和nginx的rewrite的区别
Feb 22 #PHP
php并发对MYSQL造成压力的解决方法
Feb 21 #PHP
php连接mssql数据库的几种方法
Feb 21 #PHP
PHP递归调用的小技巧讲解
Feb 19 #PHP
PHP递归返回值时出现的问题解决办法
Feb 19 #PHP
You might like
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
三个python爬虫项目实例代码
2019/12/28 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
巡警年度自我鉴定
2014/02/21 职场文书
代理协议书
2014/04/22 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
先进班集体事迹材料
2014/12/25 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
golang连接MySQl使用sqlx库
2022/04/14 Golang