使用phpmcrypt加密解密

數(shù)字簽名:對數(shù)據(jù)和私鑰進行hash運算得到消息摘要,連同消息本身一塊發(fā)給客戶端。數(shù)據(jù)簽名強調(diào)客戶端接收到的數(shù)據(jù)是來自特定服務(wù)端,服務(wù)端具有對數(shù)據(jù)不可否認性。客戶端通過確認此次簽名的正確性來判斷拿到的消息是否來自特定服務(wù)端。

成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)與策劃設(shè)計,海城網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:海城等地區(qū)。海城做網(wǎng)站價格咨詢:13518219792

數(shù)據(jù)加密:對數(shù)據(jù)進行加密,有對稱加密和非對稱加密兩種。PHP中常使用 mcrypt和openssl擴展對數(shù)據(jù)進行加解密。mcrypt常用在對稱加密中,openssl常用在非對稱加密中。另外在編程中還經(jīng)常使用到一種單項散列加密算法,比如MD5,HASH,SHA1,password_hash等對數(shù)據(jù)(通常是用戶密碼)進行加密,這種加密是不可解密的(理論上沒有不可解密的算法,只是說解密的機器耗時較長便認為不可解密。一般情況下仍然可采用暴力字典破解和查找彩虹表的方式破解),hash單向加密一般會有個鹽值。

在實際應(yīng)用場景中,有只使用數(shù)據(jù)簽名然后明文傳輸數(shù)據(jù)的(這是最多的),也有使用數(shù)據(jù)簽名和加密數(shù)據(jù)進行傳輸?shù)模话牒苌僦挥袛?shù)據(jù)加密而沒有數(shù)據(jù)簽名的情況吧。、

MCRYPT加密

首先明確這幾個概念

算法名稱:即 MCRYPT擴展所支持的密碼算法,詳細列表可參見mcrypt.c文件。mcypt支持的算法見文末。

算法模式:MCRYPT_MODE_modename 常量中的一個,或以下字符串中的一個:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。

算法模塊:使用mcrypt_module_open()打開的指定算法和模式對應(yīng)的模塊,是一個資源類型

初始向量:加密時需要用到的一個參數(shù),使用mcrypt_create_iv()從隨機源創(chuàng)建

初始向量大?。?/strong>是指由mcrypt_get_iv_size()返回的指定算法/模式組合的初始向量大小。mcrypt_create_iv()根據(jù)初始向量大小創(chuàng)建初始向量。

mcrypt加密解密需要以下幾個步驟

加密:

1 使用mcrypt_module_open()打開指定算法和模式的對應(yīng)模塊。

2 mcrypt_get_iv_size()獲得指定算法和模式的初始向量長度,或mcrypt_enc_get_iv_size($td)獲取打開模塊的初始向量長度。

3 根據(jù)初始向量長度創(chuàng)建初始向量 mcrypt_create_iv()

4 初始化加密所需的緩沖區(qū) mcrypt_generic_init()

5 加密數(shù)據(jù) mcrypt_generic()

6 結(jié)束加密,執(zhí)行清理工作 mcrypt_generic_deinit()

解密需要以下幾個步驟

1 初始化解密模塊 mcrypt_generic_init()

2 解密數(shù)據(jù) mcrypt_decrypt()

3 結(jié)束解密,執(zhí)行清理工作 mcrypt_generic_deinit()

4 關(guān)閉開始時打開的模塊 mcrypt_module_close

整個加解密的過程類似創(chuàng)建圖片的過程,首先創(chuàng)建畫布資源,創(chuàng)建顏色,填充,最后p_w_picpath_destroy一樣。

然后來看一下上面提到的幾個函數(shù)的用法

1.mcrypt_module_open — 打開算法和模式對應(yīng)的模塊

resource mcrypt_module_open ( string $algorithm , string $algorithm_directory , string $mode , string $mode_directory )

返回資源類型

參數(shù)說明見表 1-1 

表1-1 

參數(shù)說明
algorithmMCRYPT_ciphername 常量中的一個,或者是字符串值的算法名稱。見文末
algorithm_directoryalgorithm_directory 參數(shù)指示加密模塊的位置。 如果你提供此參數(shù),則使用你指定的值。 如果將此參數(shù)設(shè)置為空字符串(""),將使用 php.ini 中的 mcrypt.algorithms_dir 。 如果不指定此參數(shù),則使用 libmcrypt 的編譯路徑 (通常是 /usr/local/lib/libmcrypt)。
modeMCRYPT_MODE_modename 常量中的一個,或以下字符串中的一個:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。
mode_directoryalgorithm_directory 參數(shù)指示加密模式的位置。 如果你提供此參數(shù),則使用你指定的值。 如果將此參數(shù)設(shè)置為空字符串(""),將使用 php.ini 中的 mcrypt.modes_dir 。 如果不指定此參數(shù),則使用 libmcrypt 的編譯路徑 (通常是 /usr/local/lib/libmcrypt)。

2.mcrypt_get_iv_size — 返回指定算法/模式組合的初始向量大小

int mcrypt_get_iv_size ( string $cipher , string $mode )

返回初始向量大小

可使用mcrypt_enc_get_iv_size($td) 代替,$td可以是由 mcrypt_module_open() 返回的資源作為參數(shù)。

參數(shù)說明見表 1-2

表1-2 

參數(shù)說明
cipherMCRYPT_ciphername 常量中的一個,或者是字符串值的算法名稱。
modeMCRYPT_MODE_modename 常量中的一個,或以下字符串中的一個:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。

3.mcrypt_create_iv — 從隨機源創(chuàng)建初始向量

string mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] )

返回初始向量

表1-3

參數(shù)說明
size初始向量大小??捎蒻crypt_get_iv_size或mcrypt_enc_get_iv_size獲得
source初始向量數(shù)據(jù)來源??蛇x值有: MCRYPT_RAND (系統(tǒng)隨機數(shù)生成器), MCRYPT_DEV_RANDOM (從 /dev/random 文件讀取數(shù)據(jù)) 和 MCRYPT_DEV_URANDOM (從 /dev/urandom 文件讀取數(shù)據(jù))。 在 Windows 平臺,PHP 5.3.0 之前的版本中,僅支持 MCRYPT_RAND。

4.mcrypt_generic_init — 初始化加密所需的緩沖區(qū)

int mcrypt_generic_init ( resource $td , string $key , string $iv )

如果發(fā)生錯誤,將會返回負數(shù): -3 表示密鑰長度有誤,-4 表示內(nèi)存分配失敗, 其他值表示未知錯誤, 同時會顯示對應(yīng)的警告信息。 如果傳入?yún)?shù)不正確,返回 FALSE。

表1-4

參數(shù)說明
td加密描述符。由mcrypt_module_open獲得的資源類型
key調(diào)用 mcrypt_enc_get_key_size() 函數(shù)獲得的密鑰最大長度。 小于最大長度的數(shù)值都被視為非法參數(shù)。
iv通常情況下,向量大小等于算法的分組大小, 但是你應(yīng)該通過 mcrypt_enc_get_iv_size() 函數(shù) 來獲得這個值。在 ECB 模式下,初始向量會被忽略, 在 CFB,CBC,STREAM,nOFB 和 OFB 模式下,必須提供初始向量。 初始向量要求是隨機的,并且是唯一的(不需要是安全的)。 加密和解密必須使用相同的初始向量。 如果你不想使用初始向量,請將其設(shè)置為全 0 值,但是不建議你這么做。

5.mcrypt_generic — 加密數(shù)據(jù)

string mcrypt_generic ( resource $td , string $data )

返回加密后的數(shù)據(jù)

表1-5

參數(shù)說明
td加密描述符。由mcrypt_module_open獲得的資源類型
data要加密的數(shù)據(jù)

6.mdecrypt_generic — 解密數(shù)據(jù)

string mdecrypt_generic ( resource $td , string $data )

返回解密后的字符串

請注意,由于存在數(shù)據(jù)補齊的情況, 返回字符串的長度可能和明文的長度不相等

參數(shù) td 加密描述符。由mcrypt_module_open獲得的資源類型,data是需要解密的密文

6.mcrypt_generic_deinit — 對加密模塊進行清理工作

bool mcrypt_generic_deinit ( resource $td )

參數(shù) td 加密描述符。由mcrypt_module_open獲得的資源類型

本函數(shù)終止由加密描述符(td)指定的加密模塊, 它會清理緩沖區(qū),但是并不關(guān)閉模塊。 要想關(guān)閉加密模塊, 你需要自行調(diào)用 mcrypt_module_close() 函數(shù)。 (但是 PHP 會在腳本末尾為你關(guān)閉已打開的加密模塊)

7.mcrypt_module_close — 關(guān)閉加密模塊

bool mcrypt_module_close ( resource $td )

參數(shù) td 加密描述符。由mcrypt_module_open獲得的資源類型

下面一個例子說明加解密過程

class McryptModel{
    protected $td = '';
    protected $iv = '';
    protected $key = '';
    private static $instance = NULL;

    private function __construct($cipher,$mode,$key) {
        $this->cipher = $cipher;
        $this->mode = $mode;
        $this->key = $key;
    }

    public static function getInstance($cipher=MCRYPT_RIJNDAEL_128,$mode=MCRYPT_MODE_CBC,
    $key='H5gOs1ZshKZ6WikN') {
        if (self::$instance == NULL) {
            self::$instance = new self($cipher,$mode,$key);
        }
        return self::$instance;
    }

    function encrypt($str) {
        $td = mcrypt_module_open($this->cipher,'',$this->mode,'');//打開算法模塊
        $this->td = $td;
        $iv_size = mcrypt_enc_get_iv_size($td);// 獲取向量大小
        $iv = mcrypt_create_iv($iv_size,MCRYPT_RAND);//初始化向量
        $this->iv = $iv;
        $num = mcrypt_generic_init($td,$this->key,$iv);//初始化加密空間
        //var_dump($num);
        $encypt = mcrypt_generic($td,$str);//執(zhí)行加密
        mcrypt_generic_deinit($td); // 結(jié)束加密,執(zhí)行清理工作
        return base64_encode($encypt);//base64編碼成字符串適合數(shù)據(jù)傳輸

    }

    function decyrpt($str) {
        $str = base64_decode($str);
        $td = $this->td;
        mcrypt_generic_init($td,$this->key,$this->iv);
        $decrypt = mdecrypt_generic($td,$str);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);//關(guān)閉算法模塊
        return $decrypt;
    }
}

$m = McryptModel::getInstance();
echo $s = $m->encrypt('hello'); // 輸出 4cnqrVkCjcr5unW0ySUdWg==
echo $m->decyrpt($e);  // 輸出 hello

mcrypt加解密屬于對稱加密,算法是公開的,其安全性是來自對秘鑰的保密。用戶可選擇不同的算法名稱和算法模式。常用的算法是MCRYPT_RIJNDAEL_128,MCRYPT_DES,rijndael-256等,常用的模式是 cbc,ecb

php中支持的算法如下:

  • MCRYPT_3DES

  • MCRYPT_ARCFOUR_IV ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_ARCFOUR ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_BLOWFISH

  • MCRYPT_CAST_128

  • MCRYPT_CAST_256

  • MCRYPT_CRYPT

  • MCRYPT_DES

  • MCRYPT_DES_COMPAT ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_ENIGMA ( 僅 libmcrypt > 2.4.x 可用,MCRYPT_CRYPT 的別名)

  • MCRYPT_GOST

  • MCRYPT_IDEA (非免費算法)

  • MCRYPT_LOKI97 ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_MARS ( 僅 libmcrypt > 2.4.x 可用,非免費算法)

  • MCRYPT_PANAMA ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RIJNDAEL_128 ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RIJNDAEL_192 ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RIJNDAEL_256 ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RC2

  • MCRYPT_RC4 ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_RC6 ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RC6_128 ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_RC6_192 ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_RC6_256 ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SAFER64

  • MCRYPT_SAFER128

  • MCRYPT_SAFERPLUS ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_SERPENT( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_SERPENT_128 ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SERPENT_192 ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SERPENT_256 ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SKIPJACK ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_TEAN ( 僅 libmcrypt 2.2.x 可用 )

  • MCRYPT_THREEWAY

  • MCRYPT_TRIPLEDES ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_TWOFISH ( mcrypt 2.x 之前的版本,或者 2.4.x 之后版本可用 )

  • MCRYPT_TWOFISH128 (TWOFISHxxx 在新的 2.x 版本可用,但在 2.4.x 版本不可用)

  • MCRYPT_TWOFISH192

  • MCRYPT_TWOFISH256

  • MCRYPT_WAKE ( 僅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_XTEA ( 僅 libmcrypt > 2.4.x 可用 )

本文題目:使用phpmcrypt加密解密
文章分享:http://muchs.cn/article10/isjjdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站品牌網(wǎng)站設(shè)計、App開發(fā)、網(wǎng)站維護、靜態(tài)網(wǎng)站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)