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 相关文章推荐
PHP数据库开发知多少
Oct 09 PHP
无数据库的详细域名查询程序PHP版(3)
Oct 09 PHP
人大复印资料处理程序_查询篇
Oct 09 PHP
php基础知识:控制结构
Dec 13 PHP
php下使用SMTP发邮件的代码
Jan 10 PHP
无JS,完全php面向过程数据分页实现代码
Aug 27 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
smarty简单入门实例
Nov 28 PHP
PHP的openssl加密扩展使用小结(推荐)
Jul 18 PHP
Laravel日志用法详解
Oct 09 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
Oct 20 PHP
php数组遍历类与用法示例
May 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中__get()和__set()的用法实例详解
2013/06/04 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
jquery div拖动效果示例代码
2013/12/08 Javascript
ext combobox动态加载数据库数据(附前后台)
2014/06/17 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
Python实现批量下载文件
2015/05/17 Python
Python读取键盘输入的2种方法
2015/06/16 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
如何通过Python实现标签云算法
2019/07/02 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
python实现logistic分类算法代码
2020/02/28 Python
Python dict和defaultdict使用实例解析
2020/03/12 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
露营世界:Camping World
2017/02/02 全球购物
服装采购员岗位职责
2014/03/15 职场文书
员工工作表现评语
2014/04/26 职场文书
违纪检讨书
2015/01/27 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
大学生干部培训心得体会
2016/01/06 职场文书