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 相关文章推荐
介绍几个array库的新函数 php
Dec 29 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
Apr 25 PHP
php mssql 分页SQL语句优化 持续影响
Apr 26 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
解析PHP中ob_start()函数的用法
Jun 24 PHP
如何使用php输出时间格式
Aug 31 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
PHP INT类型在内存中占字节详解
Jul 20 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 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
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
python中的lambda表达式用法详解
2016/06/22 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
学生实习推荐信范文
2013/11/26 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
学前班语言教学计划
2015/01/20 职场文书
债务纠纷代理词
2015/05/25 职场文书
2019年工作总结范文
2019/05/21 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis