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 相关文章推荐
56.com视频采集接口程序(PHP)
Sep 22 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
PHP设置一边执行一边输出结果的代码
Sep 30 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 PHP
php更新修改excel中的内容实例代码
Feb 26 PHP
php使用curl存储cookie的示例
Mar 31 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
Oct 11 PHP
php实现表单提交上传文件功能
May 28 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 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操作xml代码
2010/06/17 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
利用javascript查看html源文件
2006/11/08 Javascript
javascript 数组排序函数
2009/08/20 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python读取Excel表格文件的方法
2019/09/02 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Python 在局部变量域中执行代码
2020/08/07 Python
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
体育教师工作总结的自我评价
2013/10/10 职场文书
2014年路政工作总结
2014/12/10 职场文书
邀请函格式范文
2015/02/02 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python