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 相关文章推荐
图书管理程序(一)
Oct 09 PHP
php 分页原理详解
Aug 21 PHP
PHP Class&amp;Object -- 解析PHP实现二叉树
Jun 25 PHP
PHPThumb图片处理实例
May 03 PHP
PHP中变量引用与变量销毁机制分析
Nov 15 PHP
迁移PHP版本到PHP7
Feb 06 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 PHP
laravel 解决paginate查询多个字段报错的问题
Oct 22 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
js 学习笔记(三)
2009/12/29 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
Python简明入门教程
2015/08/04 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
python如何实现代码检查
2019/06/28 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
会计电算化应届生求职信
2013/11/03 职场文书
车间调度岗位职责
2013/11/30 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
避暑山庄导游词
2015/02/04 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL