1. 程式人生 > >常用對稱加密演算法(DES/AES)類(PHP)

常用對稱加密演算法(DES/AES)類(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;
    }



}

給個小demo吧
<?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>';


相關推薦

常用對稱加密演算法DES/AESPHP

看註釋,啥也不說了,歡迎各種跨平臺測試! /** * 常用對稱加密演算法類 * 支援金鑰:64/128/256 bit(位元組長度8/16/32) * 支援演算法:DES/AES(根據金鑰長度自動匹配使用:DES:64bit AES:128/256bit) * 支

Java常用對稱加密演算法-DES

直接上程式碼import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.SecureRandom; impo

Java常用對稱加密演算法-AES

import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.SecureRandom; import jav

Java 加密解密 對稱加密演算法對稱加密演算法 MD5 BASE64 AES RSA

【前言】 本文簡單的介紹了加密技術相關概念,最後總結了java中現有的加密技術以及使用方法和例子 【最簡單的加密】1.簡單的概念 明文:加密前的資訊 密文:機密後的資訊 演算法:加密或解密的演算法 金鑰:演算法使用的鑰匙(讀作miyao,正確應該是miyue,但是大家都讀m

對稱DES/AES與非對稱RSA/SSL/數字證書加密介紹及實際應用

行數據 服務端 版本 報道 pass edi 得到 參數 crc 本文不對具體的算法做深入研究,只是講解各種安全算法的原理和使用場景。 一、數據校驗算法 數據校驗,是為保護數據的完整性,用一種指定的算法對原始數據計算出的一個校驗值。當接收方用同樣的算法再算一次校驗值,如

對稱加密演算法常用的五種分組模式ECB/CBC/CFB/OFB/CTR

版權宣告:本文為作者原創,如需轉載,請註明出處 https://blog.csdn.net/weixin_42940826 注:以下圖片來自於《圖解密碼學》,這本書講的更全面細緻,建議閱讀,在我資源庫中有此書,還有使用go語言具體實現和解釋此書中的各種加密演算法的文件,有需要的可以自

常用對稱加密DES、3DES具體實現go語言

DES簡介和實現 DES – Data Encryption Standard (已經被破解不再使用,但是很有研究價值,而且誕生出了3DES還可以使用) 常見問題 Q1 :是不是分組密碼? A :是, 先對資料進行分組, 然後在加密或解密 Q2:D

JAVA 常用加密演算法對稱加密DES、3DES和AES

1、對稱加密演算法 1.1 定義 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,資料發信方將明文(原始資料)和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰

對稱加密演算法——DES演算法python實現

一、DES演算法描述         DES演算法總的說來可以兩部分組成: 1、對金鑰的處理。這一部分是把我們用的64位金鑰(實際用的56位,去掉了8個奇偶校驗位)分散成16個48位的子金鑰。 2、對資料的加密。通過第一步生成的子金鑰來加密我們所要加密的資料,最終生成密文。 下面就通過這兩

計算機網路安全 —— 對稱加密演算法 DES

一、對稱加密演算法概念        我們通過計算機網路傳輸資料時,如果無法防止他人竊聽, 可以利用密碼學技術將傳送的資料變換成對任何不知道如何做逆變換人都不可理解的形式, 從而保證了資料的機密性。這種變換被稱為加密( encryption),被加密的資料被稱為密 文(

加密算法(DES,AES,RSA,MD5,SHA1,Base64)比較和項目應用轉載

and tcp 認證 sha1 http 用兩個 col token 初級 加密技術通常分為兩大類:"對稱式"和"非對稱式"。 對稱性加密算法:對稱式加密就是加密和解密使用同一個密鑰。信息接收雙方都需事先知道密匙和加解密算法且其密匙是相同的,之後便是對數據進行加解密了。對

對稱加密過程詳解基於RSA非對稱加密演算法實現

1、非對稱加密過程:         假如現實世界中存在A和B進行通訊,為了實現在非安全的通訊通道上實現資訊的保密性、完整性、可用性(即資訊保安的三個性質),A和B約定使用非對稱加密通道進行通訊,具體過程如下:   說明:         國內目前使用雙證書體系,即

對稱加密演算法-DES,3DES,AES

1.jdk與bc實現DES演算法: package com.samlai.security; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.sec

程式設計師之網路安全系列:資料加密對稱加密演算法

系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 上一節,我們使用了Ha

DES 3DES AES Blowfish 對稱加密演算法比較

計算機加密技術分為對稱加密,及非對稱加密兩種技術. 對稱加密技術基本的實現是:資料傳送方和資料接收方共享一個金鑰,進行資料加密和解密工作。但是他也有個問題,就是一旦金鑰被第三方獲取,資料安全性就無法保證。 非對稱加密技術中,資料傳送方和接收方利用不同的金鑰進行資料加密及解密工作。簡言之,就是金鑰1只能

對稱加密演算法3:ElGamal

一.ElGamal:ElGamal演算法,是一種較為常見的加密演算法,它是基於1985年提出的公鑰密碼體制和橢圓曲線加密體系。既能用於資料加密也能用於數字簽名,其安全性依賴於計算有限域上離散對數這一難題。在加密過程中,生成的密文長度是明文的兩倍,且每次加密後都會在密文中生成

密碼編碼學初探——分組加密技術DES&AES

基本術語:分組密碼 混淆 擴散 Feistel結構 可逆對映 資料加密標準(DES [64位]) 高階加密標準(AES[128位]) 1.流密碼與分組密碼 流密碼:即一次只加密一個位元組或

[加密]--PHP 使用非對稱加密演算法RSA

解釋 非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。 公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密; 如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。 因為加密和

DES/3DES/AES 三種對稱加密演算法在 Java 中的實現

有兩句話是這麼說的:1)演算法和資料結構就是程式設計的一個重要部分,你若失掉了演算法和資料結構,你就把一切都失掉了。2)程式設計就是演算法和資料結構,演算法和資料結構是程式設計的靈魂。注意,這可不是我說的,是無數程式設計師總結的,話說的很實在也很精闢,若想長久可持續發展,多研

對稱加密演算法2:RSA

一.RSA:RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美國公佈,當時他們三人都在麻省理工學院工作實習。RSA就是他們