Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1524903
  • 博文数量: 164
  • 博客积分: 2993
  • 博客等级: 少校
  • 技术积分: 1718
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 11:42
文章分类

全部博文(164)

文章存档

2014年(1)

2013年(36)

2012年(90)

2011年(37)

分类: Web开发

2013-06-24 10:10:44

php中3DES加密技术 

因为工作中要用到加密,接口中要求也是用密文传输数据,用到3des加密,就研究了一下。

在网上也找了好多,但是都不可以用,没法正式运行,终于找到一个可以运行的,自己又修改了一下,记录下来,以后还可能会用到。
下面安装我要调用的接口文实例:

在调用PHP中的mcrypt_get_block_size()函数时需要:

启用Mcrypt函数集。linux下要安装libmcrypt,windows下找到php.ini文件里

extension=php_mcrypt.dll

extension=php_mcrypt_filter.dll
接口要求:
先用3DES对数据进行加密,在用BASE64进行加密。即:BASE64(3DES(value))

3DES加密规则:      
        模式:ECB
       填充模式:PKCS7Padding
       数据块大小:8字节(64位)
       初始化向量:无
       密钥:XXXXXXXXXXXXXXXXX

首先是一个封装好的类文件:

encrypt_class.php//文件名


  1. <?php
  2. class Crypt3Des {
  3.     public $key = "bugaosuni"; // 这个根据实际情况写
  4.     function encrypt($input) { // 数据加密
  5.         $size = mcrypt_get_block_size ( MCRYPT_3DES, 'ecb' );
  6.         $input = $this->pkcs5_pad ( $input, $size );
  7.         $key = str_pad ( $this->key, 24, '0' );
  8.         $td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' );
  9.         $iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
  10.         @mcrypt_generic_init ( $td, $key, $iv );
  11.         $data = mcrypt_generic ( $td, $input );
  12.         mcrypt_generic_deinit ( $td );
  13.         mcrypt_module_close ( $td );
  14.         $data = base64_encode ( $data );
  15.         return $data;
  16.     }
  17.     function decrypt($encrypted) { // 数据解密
  18.         $encrypted = base64_decode ( $encrypted );
  19.         $key = str_pad ( $this->key, 24, '0' );
  20.         $td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' );
  21.         $iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
  22.         $ks = mcrypt_enc_get_key_size ( $td );
  23.         @mcrypt_generic_init ( $td, $key, $iv );
  24.         $decrypted = mdecrypt_generic ( $td, $encrypted );
  25.         mcrypt_generic_deinit ( $td );
  26.         mcrypt_module_close ( $td );
  27.         $y = $this->pkcs5_unpad ( $decrypted );
  28.         return $y;
  29.     }
  30.     function pkcs5_pad($text, $blocksize) {
  31.         $pad = $blocksize - (strlen ( $text ) % $blocksize);
  32.         return $text . str_repeat ( chr ( $pad ), $pad );
  33.     }
  34.     function pkcs5_unpad($text) {
  35.         $pad = ord ( $text {strlen ( $text ) - 1} );
  36.         if ($pad > strlen ( $text )) {
  37.             return false;
  38.         }
  39.         if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad) {
  40.             return false;
  41.         }
  42.         return substr ( $text, 0, - 1 * $pad );
  43.     }
  44.     function PaddingPKCS7($data) {
  45.         $block_size = mcrypt_get_block_size ( MCRYPT_3DES, MCRYPT_MODE_CBC );
  46.         $padding_char = $block_size - (strlen ( $data ) % $block_size);
  47.         $data .= str_repeat ( chr ( $padding_char ), $padding_char );
  48.         return $data;
  49.     }
  50. }

  51. $rep = new Crypt3Des (); // 初始化一个对象
  52. $input = "hello worldfdfdfdfdd";
  53. echo "原文:" . $input . "
    "
    ;
  54. $encrypt_card = $rep->encrypt ( $input );
  55. echo "加密:" . $encrypt_card . "
    "
    ;
  56. echo "解密:" . $rep->decrypt ( $rep->encrypt ( $input ) );

  57. ?>
这是一个非常有用的3des加密,在多数情况下可以直接拿来用。很不错哦~!@
阅读(5602) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~