当前位置:首页 > PHP教程 > php应用 > 列表

php DES加密算法实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-18 22:53:21 浏览: 评论:0 

这篇文章主要介绍了php DES加密算法,结合实例形式分析了yii框架的DES加密算法类定义,以及兼容C#和java的3DES加密算法实现技巧,需要的朋友可以参考下。

本文实例讲述了php DES加密算法,分享给大家供大家参考,具体如下:

yii框架的DES代码:

  1. <?php 
  2. /** 
  3.  *@see Yii CSecurityManager; 
  4.  */ 
  5. class Des{ 
  6.  public static function encrypt($data,$key){ 
  7.    $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,''); 
  8.    $key=substr(md5($key),0,mcrypt_enc_get_key_size($module)); 
  9.    srand(); 
  10.    $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND); 
  11.    mcrypt_generic_init($module,$key,$iv); 
  12.    $encrypted=$iv.mcrypt_generic($module,$data); 
  13.    mcrypt_generic_deinit($module); 
  14.    mcrypt_module_close($module); 
  15.    return md5($data).'_'.base64_encode($encrypted); 
  16.  } 
  17.  public static function decrypt($data,$key){   
  18.    $_data = explode('_',$data,2); 
  19.    if(count($_data)<2){ 
  20.     return false; 
  21.    } 
  22.    $data = base64_decode($_data[1]);    
  23.    $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,''); 
  24.    $key=substr(md5($key),0,mcrypt_enc_get_key_size($module)); 
  25.    $ivSize=mcrypt_enc_get_iv_size($module); 
  26.    $iv=substr($data,0,$ivSize); 
  27.    mcrypt_generic_init($module,$key,$iv); 
  28.    $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data))); 
  29.    mcrypt_generic_deinit($module); 
  30.    mcrypt_module_close($module); 
  31.    $decrypted = rtrim($decrypted,"\0");     
  32.    if($_data[0]!=md5($decrypted)){ 
  33.     return false; 
  34.    } 
  35.    return $decrypted
  36.  } 

在网上看到了一篇文章,讲到:

由于PHP使用mcrypt扩展进行3DES加密,填充模式是跟JAVA以及.NET是不一样的,JAVA和.NET填充模式使用的是PKCS7。

所以PHP端必须自定义一个函数对加密字符串进行PKCS7模式补位填充。

另外一点就是双方的KEY注意进行base64编码,最后PHP端经过3DES加密后得到的结果也需要进行base64编码。

以上几点都做好之后,加密结果就一致了。

下面是兼容C#和java的3DES加密的算法

  1. <?php 
  2. class STD3Des 
  3.   private $key = ""
  4.   private $iv = ""
  5.   /** 
  6.   * 构造,传递二个已经进行base64_encode的KEY与IV 
  7.   * 
  8.   * @param string $key 
  9.   * @param string $iv 
  10.   */ 
  11.   function __construct ($key$iv
  12.   { 
  13.     if (emptyempty($key) || emptyempty($iv)) { 
  14.       echo 'key and iv is not valid'
  15.       exit(); 
  16.     } 
  17.     $this->key = $key
  18.     $this->iv = $iv
  19.   } 
  20.   /** 
  21.   *加密 
  22.   * @param <type> $value 
  23.   * @return <type> 
  24.   */ 
  25.   public function encrypt ($value
  26.   { 
  27.     $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); 
  28.     $iv = base64_decode($this->iv); 
  29.     $value = $this->PaddingPKCS7($value); 
  30.     $key = base64_decode($this->key); 
  31.     mcrypt_generic_init($td$key$iv); 
  32.     $ret = base64_encode(mcrypt_generic($td$value)); 
  33.     mcrypt_generic_deinit($td); 
  34.     mcrypt_module_close($td); 
  35.     return $ret
  36.   } 
  37.   /** 
  38.   *解密 
  39.   * @param <type> $value 
  40.   * @return <type> 
  41.   */ 
  42.   public function decrypt ($value
  43.   { 
  44.     $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); 
  45.     $iv = base64_decode($this->iv); 
  46.     $key = base64_decode($this->key); 
  47.     mcrypt_generic_init($td$key$iv); 
  48.     $ret = trim(mdecrypt_generic($tdbase64_decode($value))); 
  49.     $ret = $this->UnPaddingPKCS7($ret); 
  50.     mcrypt_generic_deinit($td); 
  51.     mcrypt_module_close($td); 
  52.     return $ret
  53.   } 
  54.   private function PaddingPKCS7 ($data
  55.   { 
  56.     $block_size = mcrypt_get_block_size('tripledes''cbc'); 
  57.     $padding_char = $block_size - (strlen($data) % $block_size); 
  58.     $data .= str_repeat(chr($padding_char), $padding_char); 
  59.     return $data
  60.   } 
  61.   private function UnPaddingPKCS7($text
  62.   { 
  63.     $pad = ord($text{strlen($text) - 1}); 
  64.     if ($pad > strlen($text)) { 
  65.       return false; 
  66.     } 
  67.     if (strspn($textchr($pad), strlen($text) - $pad) != $pad) { 
  68.       return false; 
  69.     } 
  70.     return substr($text, 0, - 1 * $pad); 
  71.   } 
  72. ?>

Tags: DES加密算法 php加密算法

分享到: