Heim Backend-Entwicklung PHP-Tutorial php对称加密算法示例_PHP教程

php对称加密算法示例_PHP教程

Jul 13, 2016 am 10:30 AM
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, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
 }

 public static function decrypt($code){
  return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(KEY), base64_decode($code), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND));
 }

}

常用对称加密算法(DES/AES)类

xcrypt.php

复制代码 代码如下:

/**
 * 常用对称加密算法类
 * 支持密钥: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); 
            $ret = trim($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; 
    }

上面类的使用方法

复制代码 代码如下:

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

include "xcrypt.php"; 

echo '
';    <br>$a = isset($_GET['a']) ? $_GET['a'] : '测试123';  <br><br>//密钥  <br>$key = '12345678123456781234567812345678'; //256 bit  <br>$key = '1234567812345678'; //128 bit  <br>$key = '12345678'; //64 bit  <br><br>//设置模式和IV  <br>$m = new Xcrypt($key, 'cbc', 'auto');  <br><br>//获取向量值  <br>echo '向量:';  <br>var_dump($m-&gt;getIV());  <br><br>//加密  <br>$b = $m-&gt;encrypt($a, 'base64');  <br>//解密  <br>$c = $m-&gt;decrypt($b, 'base64');  <br><br>echo '加密后:';  <br>var_dump($b);  <br>echo '解密后:';  <br>var_dump($c);  <br>echo '
Nach dem Login kopieren
'; 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/766111.htmlTechArticlephp对称加密算法 KEY 是之前定义的常量 复制代码 代码如下: Mcrypt::encrypt(); Mcrypt::decrypt(); 复制代码 代码如下: defined('ROOT') or exit('Access Denie...
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

CakePHP Datum und Uhrzeit

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

CakePHP-Datei hochladen

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

CakePHP-Routing

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

CakePHP-Projektkonfiguration

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

Besprechen Sie CakePHP

CakePHP-Kurzanleitung CakePHP-Kurzanleitung Sep 10, 2024 pm 05:27 PM

CakePHP-Kurzanleitung

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein

See all articles