当前位置:编程学习 > > 正文

php代码最可靠的加密方式(php DES加密算法实例分析)

时间:2021-10-20 08:18:02类别:编程学习

php代码最可靠的加密方式

php DES加密算法实例分析

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

yii框架的DES代码

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

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

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

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

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

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • <?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);
  •   }
  • }
  • ?>
  • 希望本文所述对大家PHP程序设计有所帮助。

    原文链接:https://blog.csdn.net/koastal/article/details/51577321

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐