返回介绍

10.1.2 AES 加密

发布于 2024-10-11 22:07:47 字数 2732 浏览 0 评论 0 收藏 0

AES(Advanced Encryption Standard)加密在密码学中又称 Rijndael 加密法,比 3DES 更加安全,密钥长度的最少支持为 128、192、256 位,所以逐渐替代原先的 DES。

PHP 中需要在 php.ini 中打开 php_mcrypt.dll 库的引用,设置方法我们已在上一小节介绍过,我们来看一个 PHP 中 AES 的加解密实例:

<?php

class Aes{

  public $_secrect_key='' ; // 密钥 

  function Aes ( $key ) {

    $this->_secrect_key = $key ; 

  }

  /**

   * 加密方法 

   * @param string $str

   * @return string

   */

  function encrypt ( $str ) {

    //AES , 128 ECB 模式加密数据 

    $screct_key = $this->_secrect_key ; 

    $screct_key = base64_decode ( $screct_key ); 

    $str = trim ( $str ); 

    $str = $this->addPKCS7Padding ( $str ); 

    $iv = mcrypt_create_iv ( mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_128 , MCRYPT_MODE_ECB ), MCRYPT_RAND ); 

    $encrypt_str =  mcrypt_encrypt ( MCRYPT_RIJNDAEL_128 , $screct_key , $str , MCRYPT_MODE_ECB , $iv ); 

    return base64_encode ( $encrypt_str ); 

  }

  /**

   * 解密方法 

   * @param string $str

   * @return string

   */

  function decrypt ( $str ) {

    //AES , 128 ECB 模式加密数据 

    $screct_key = $this->_secrect_key ; 

    $str = base64_decode ( $str ); 

    $screct_key = base64_decode ( $screct_key ); 

    $iv = mcrypt_create_iv ( mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_128 , MCRYPT_MODE_ECB ), MCRYPT_RAND ); 

    $encrypt_str =  mcrypt_decrypt ( MCRYPT_RIJNDAEL_128 , $screct_key , $str , MCRYPT_MODE_ECB , $iv ); 

    $encrypt_str = trim ( $encrypt_str ); 

    $encrypt_str = $this->stripPKSC7Padding ( $encrypt_str ); 

    return $encrypt_str ; 

  }

  /**

   * 填充算法 

   * @param string $source

   * @return string

   */

  function addPKCS7Padding ( $source ) {

    $source = trim ( $source ); 

    $block = mcrypt_get_block_size ( 'rijndael-128' , 'ecb' ); 

    $pad = $block - ( strlen ( $source ) % $block ); 

    if ( $pad <= $block ) {

    $char = chr ( $pad ); 

    $source .= str_repeat ( $char , $pad ); 

    }

    return $source ; 

  }

  /**

   * 移去填充算法 

   * @param string $source

   * @return string

   */

  function stripPKSC7Padding ( $source ) {

    $source = trim ( $source ); 

    $char = substr ( $source , -1 ); 

    $num = ord ( $char ); 

    if ( $num==62 ) return $source ; 

    $source = substr ( $source , 0 , -$num ); 

    return $source ; 

  }

}

这个加密类使用起来也相当简单:

$rep=new Aes ( 'xxxx' ); 

$input="hello aes" ; 

echo " 原文: ".$input."<br/>" ; 

$encrypt_card=$rep->encrypt ( $input ); 

echo " 加密: ".$encrypt_card."<br/>" ; 

echo " 解密: ".$rep->decrypt ( $rep->encrypt ( $input ));

我们来看看使用它加解密后的效果,如图 10-3 所示。

图 10-3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文