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 和 MYSQL
Oct 09 PHP
深入了解php4(2)--重访过去
Oct 09 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
Aug 07 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
PHP迭代器和生成器用法实例分析
Sep 28 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
javascript解析json格式的数据方法详解
2020/08/07 Javascript
对python3 sort sorted 函数的应用详解
2019/06/27 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
python解析多层json操作示例
2019/12/30 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
护理中职生求职信范文
2014/02/24 职场文书
大学生求职信
2014/06/17 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
第二次离婚起诉书
2015/05/18 职场文书
竞聘书的秘诀
2019/04/02 职场文书
2019 入党申请书范文
2019/07/10 职场文书
bose降噪耳机音能消除人声吗
2022/04/19 数码科技
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python