PHP对称加密算法(DES/AES)类的实现代码

对称密钥加密机制即对称密码体系,也称为单钥密码体系和传统密码体系。对称密码体系通常分为两大类,一类是分组密码(如DES、AES算法),另一类是序列密码(如RC4算法)。

AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。

那DES是什么呢?DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DSA),已与作为标准的DES区分开来。

DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。

/**
 * 常用对称加密算法类
 * 支持密钥:64/128/256 bit(字节长度8/16/32)
 * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)
 * 支持模式:CBC/ECB/OFB/CFB
 * 密文编码:base64字符串/十六进制字符串/二进制字符串流
 * 填充方式: PKCS5Padding(DES)
 *
 * @author: linvo
 * @version: 1.0.0
 * @date: 2013/1/10
 */
class Xcrypt{  

  private $mcrypt;
  private $key;
  private $mode;
  private $iv;
  private $blocksize;  

  /**
   * 构造函数
   *
   * @param string 密钥
   * @param string 模式
   * @param string 向量("off":不使用 / "auto":自动 / 其他:指定值,长度同密钥)
   */
  public function __construct($key, $mode = 'cbc', $iv = "off"){
    switch (strlen($key)){
    case 8:
      $this->mcrypt = MCRYPT_DES;
      break;
    case 16:
      $this->mcrypt = MCRYPT_RIJNDAEL_128;
      break;
    case 32:
      $this->mcrypt = MCRYPT_RIJNDAEL_256;
      break;
    default:
      die("Key size must be 8/16/32");
    }  

    $this->key = $key;  

    switch (strtolower($mode)){
    case 'ofb':
      $this->mode = MCRYPT_MODE_OFB;
      if ($iv == 'off') die('OFB must give a IV'); //OFB必须有向量
      break;
    case 'cfb':
      $this->mode = MCRYPT_MODE_CFB;
      if ($iv == 'off') die('CFB must give a IV'); //CFB必须有向量
      break;
    case 'ecb':
      $this->mode = MCRYPT_MODE_ECB;
      $iv = 'off'; //ECB不需要向量
      break;
    case 'cbc':
    default:
      $this->mode = MCRYPT_MODE_CBC;
    }  

    switch (strtolower($iv)){
    case "off":
      $this->iv = null;
      break;
    case "auto":
      $source = PHP_OS=='WINNT' ? MCRYPT_RAND : MCRYPT_DEV_RANDOM;
      $this->iv = mcrypt_create_iv(mcrypt_get_block_size($this->mcrypt, $this->mode), $source);
      break;
    default:
      $this->iv = $iv;
    }  

  }  

  /**
   * 获取向量值
   * @param string 向量值编码(base64/hex/bin)
   * @return string 向量值
   */
  public function getIV($code = 'base64'){
    switch ($code){
    case 'base64':
      $ret = base64_encode($this->iv);
      break;
    case 'hex':
      $ret = bin2hex($this->iv);
      break;
    case 'bin':
    default:
      $ret = $this->iv;
    }
    return $ret;
  }  

  /**
   * 加密
   * @param string 明文
   * @param string 密文编码(base64/hex/bin)
   * @return string 密文
   */
  public function encrypt($str, $code = 'base64'){
    if ($this->mcrypt == MCRYPT_DES) $str = $this->_pkcs5Pad($str);  

    if (isset($this->iv)) {
      $result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);
    } else {
      @$result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode);
    }  

    switch ($code){
    case 'base64':
      $ret = base64_encode($result);
      break;
    case 'hex':
      $ret = bin2hex($result);
      break;
    case 'bin':
    default:
      $ret = $result;
    }  

    return $ret;  

  }  

  /**
   * 解密
   * @param string 密文
   * @param string 密文编码(base64/hex/bin)
   * @return string 明文
   */
  public function decrypt($str, $code = "base64"){
    $ret = false;  

    switch ($code){
    case 'base64':
      $str = base64_decode($str);
      break;
    case 'hex':
      $str = $this->_hex2bin($str);
      break;
    case 'bin':
    default:
    }  

    if ($str !== false){
      if (isset($this->iv)) {
        $ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);
      } else {
        @$ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode);
      }
      if ($this->mcrypt == MCRYPT_DES) $ret = $this->_pkcs5Unpad($ret);
    }  

    return $ret;
  }   

  private function _pkcs5Pad($text){
    $this->blocksize = mcrypt_get_block_size($this->mcrypt, $this->mode);
    $pad = $this->blocksize - (strlen($text) % $this->blocksize);
    return $text . str_repeat(chr($pad), $pad);
  }  

  private function _pkcs5Unpad($text){
    $pad = ord($text{strlen($text) - 1});
    if ($pad > strlen($text)) return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
    $ret = substr($text, 0, -1 * $pad);
    return $ret;
  }  

  private function _hex2bin($hex = false){
    $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;
    return $ret;
  }  

}  

使用实例

<?php
header('Content-Type:text/html;Charset=utf-8;');  

include "xcrypt.php";  

echo '<pre>';
//////////////////////////////////////
$a = isset($_GET['a']) ? $_GET['a'] : '测试123';  

//密钥
$key = '12345678123456781234567812345678'; //256 bit
$key = '1234567812345678'; //128 bit
$key = '12345678'; //64 bit  

//设置模式和IV
$m = new Xcrypt($key, 'cbc', 'auto');  

//获取向量值
echo '向量:';
var_dump($m->getIV());  

//加密
$b = $m->encrypt($a, 'base64');
//解密
$c = $m->decrypt($b, 'base64');  

echo '加密后:';
var_dump($b);
echo '解密后:';
var_dump($c);  

/////////////////////////////////////////
echo '</pre>'; 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • php中简单的对称加密算法实现

    前言 在网上找到了一个不错的PHP方面的对称加密算法:在PHP的语法环境里,有urlencode与urldecode,base64_encode和base64_decode自带的对称算法,不过这些自带的算法不能称之为加密算法,只能说是编码方式而已.可是我们可以利用这些来进行一些加工,来实现简单的加密和解密算法. 这次的加密和解密算法是使用base64的方式改编的.通常我们使用base64_encode($str)产生的字符串,不经过任何的加工的话,base64_decode()就能转回我们之前的

  • php对称加密算法示例

    php对称加密算法 KEY 是之前定义的常量 复制代码 代码如下: Mcrypt::encrypt();Mcrypt::decrypt(); 复制代码 代码如下: defined('ROOT') or exit('Access Denied'); class Mcrypt{ public static function encrypt($code){  return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(KEY), $code

  • Java对称加密算法DES实例详解

    本文实例讲述了Java对称加密算法DES.分享给大家供大家参考,具体如下: 一 DES算法概述 1.介绍 DES:Data Encryption Standard 数据加密标准. 2.DES算法参数 二 DES算法Java实现 package com.imooc.security.des; import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto

  • PHP对称加密算法(DES/AES)类的实现代码

    对称密钥加密机制即对称密码体系,也称为单钥密码体系和传统密码体系.对称密码体系通常分为两大类,一类是分组密码(如DES.AES算法),另一类是序列密码(如RC4算法). AES 是一个新的可以用于保护电子数据的加密算法.明确地说,AES 是一个迭代的.对称密钥分组的密码,它可以使用128.192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据.与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据.通过分组密码返回的加密数据 的位数与输入数据相同.迭代加密

  • java基于Des对称加密算法实现的加密与解密功能详解

    本文实例讲述了java基于Des对称加密算法实现的加密与解密功能.分享给大家供大家参考,具体如下: Des 加密相关类介绍: SecureRandom  这个类是继承自java.util.Random 这个类 SecureRandom 这个类的构造器有三种,下面例举两种: SecureRandom()构造一个实现默认随机数算法的安全随机数生成器 (RNG). SecureRandom(byte[] seed)构造一个实现默认随机数算法的安全随机数生成器 (RNG). DESKeySpec 这个类

  • Java实现的对称加密算法AES定义与用法详解

    本文实例讲述了Java实现的对称加密算法AES定义与用法.分享给大家供大家参考,具体如下: 一 简介 1.AES是目前使用最多的对称加密算法. 2.AES的优势之一是至今尚未被破解. 3.AES通常用于移动通信系统加密以及基于SSH协议(SSH Client.SecrueCRT)的软件. 二 特点 1.高级的 2.DES替代者 三 AES的参数说明 四 代码实现 package com.imooc.security.aes; import java.security.Key; import ja

  • Python3对称加密算法AES、DES3实例详解

    本文实例讲述了Python3对称加密算法AES.DES3.分享给大家供大家参考,具体如下: python3.6此库安装方式,需要pip3 install pycryptodome. 如有site-packages中存在crypto.pycrypto,在pip之前,需要pip3 uninstall crypto.pip3 uninstall pycrypto,否则无法安装成功. C:\WINDOWS\system32>pip3 install pycryptodome Collecting pyc

  • Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现.部分常用的加密方法基本都有对应的Python库,基本不再需要我们用代码实现具体算法. MD5加密 全称:MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致.md5加密算法是不可逆的,所以解密一般都是通过暴力穷举方法,通过网站的接口实现解密.Python代码: i

  • Vue中使用crypto-js AES对称加密算法实现加密解密

    目录 下载crypto-js 加密解密数据 AES算法的ECB模式加密-设置秘钥 AES算法的CBC模式加密-设置秘钥和偏移量 参考: 在数字加密算法中,通过可划分为对称加密和非对称加密 对称加密:如AES,DES,3DES 含义:加密和解密使用的是同一把钥匙.密钥不能在网络中传输,避免被拦截.如果要传输,必须要对密钥进行非对称加密再加密一次. 优点:算法简单,加密解密容易,效率高,执行快. 缺点:相对来说不算特别安全,只有一把钥匙,密文如果被拦截,且密钥也被劫持,那么,信息很容易被破译. 非对

  • java基于AES对称加密算法实现的加密与解密功能示例

    本文实例讲述了java基于AES对称加密算法实现的加密与解密功能.分享给大家供大家参考,具体如下: package com.soufun.com; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import

  • Golang实现AES对称加密算法实例详解

    目录 前言 前置知识 生成随机数 生成随机字符串 加密和解密 加密 解密 总结 前言 安全总是相对的,对于敏感数据最好要有一定保护措施,尤其是在线数据,通过加密可转换信息为编码,从而防止非法获取.对开发者来说,加密本质是保护应用程序数据,假设我们以明文存储用户密码,可能会导致信息泄露.使用密文在一定程度上可避免信息落入他人之手,本文介绍Golang的对称加密算法实现. 前置知识 在正式学习加密解密之前,首先看看如何生成随机数,以及为什么要随机数. 生成随机数 编程中生成随机数或字符串非常重要,它

随机推荐