php mcrypt的加密解密實例代碼

怪我咯
發布: 2023-03-13 18:16:01
原創
1239 人瀏覽過

1.簡介

Mcrypt是PHP的一個擴展,完成了常用加密演算法的封裝。其實該擴充功能是mcrypt標準類別庫的封裝,mcrypt完成了相當多的常用加密演算法,如DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 和GOST加密演算法,並提供了CBC、OFB、CFB 和ECB 四種區塊加密的模型。

2.安裝和使用

要使用該擴展,必須先安裝mcrypt標準類別庫,可以在http://mcrypt.sourceforge.net 下載。此擴充的編譯和安裝方式和常規的php擴充相同,不在詳細說明了。

3.四種區塊加密模型

Mcrypt支援四種區塊加密模型,簡單說明如下:

①. MCRYPT_MODE_ECB(electronic codebook)適合對小數量隨機資料的加密,例如加密使用者的登入密碼之類的。

②. MCRYPT_MODE_CBC (cipher block chaining) 適合加密安全等級較高的重要檔案類型。

③. MCRYPT_MODE_CFB (cipher feedback) 適合於需要對資料流的每一位元組進行加密的場合。

④. MCRYPT_MODE_OFB (output feedback, in 8bit) 和CFB模式相容,但比CFB模式更安全。 CFB模式會造成加密的錯誤擴散,如果一個byte出錯,則其後續的所有byte都會出錯。 OFB模式則不會有此問題。但該模式的安全度不是很高,不建議使用。

⑤. MCRYPT_MODE_NOFB (output feedback, in nbit) 和OFB相容,由於採用了區塊操作演算法,安全度更高。

⑥. MCRYPT_MODE_STREAM 是為了WAKE或RC4等流加密演算法提供的額外模型。

NOFB和STREAM只當mycrypt的版本號碼大於等於libmcrypt-2.4.x才有效。 (現在基本上都是大於這個版本了,libmcrypt的最新主版本已經到4了)

#4.查看支援的演算法和模型

①. mcrypt_list_modes ()列出目前環境支援的模型

②. mcrypt_list_algorithms()列出目前環境支援的演算法

如命令列執行:

#程式碼如下:

php -r "var_dump(mcrypt_list_modes()); var_dump(mcrypt_list_algorithms());"
登入後複製

即可列出所有的結果。

5.如何使用

範例1:

<?php
$key = "this is a secret key";
$input = "Let us meet at 9 o&#39;clock at the secret place.";
$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
?>
登入後複製

最簡單的方式如範例1所示,該方法顯示對$input使用3DES的演算法進行加密,加密金鑰是$key.不過這中直接呼叫的方法已經不被官方推薦使用,也建議大家在開發中不要使用此種方式,不一定哪天該方法就不能用了。在php5下使用此種方式呼叫時,能看到一則warning訊息,提示「PHP Warning: attempt to use an empty IV, which is NOT recommend」。

官方推薦的使用方式如範例2所示

範例2: 

<?php
    $key = "this is a secret key";
    $input = "Let us meet at 9 o&#39;clock at the secret place.";
    // 打开mcrypt,或者mcrypt类型的资源对象,该对象使用ecb模式,使用3des作为加密算法。
    $td = mcrypt_module_open(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
    // 创建iv(初始化向量)
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    // 根据密钥和iv初始化$td,完成内存分配等初始化工作
    mcrypt_generic_init($td, $key, $iv);
    // 进行加密
    $encrypted_data = mcrypt_generic($td, $input);
    // 反初始化$td,释放资源
    mcrypt_generic_deinit($td);
    // 关闭资源对象,退出
     mcrypt_module_close($td);
?>
登入後複製

上述過程完成了資料的加密過程。首先選擇加密演算法和加密模式建立mcrypt的資源物件和IV,然後初始化加密所需的buffer(記憶體),進行加密後再釋放buffer,最後關閉資源物件。

解密的過程和加密基本上是相同,只要把mcrypt_generic($td, $input)替換成mdecrypt_generic($td, $input)就可以了,其它部分完全相同。當然,對於3des這種對稱加密演算法而言,加密、解密所用的key是必須完全相同的。

6. 有關IV

不是所有的模型中都需要IV. CFB和OFB是必須有IV, CBC和EBC則是可選的。對於必選IV的模式來說,其加密和解密的IV的值必須完全相同,CBC和EBC則無此要求。可以相同也可以不同,沒什麼關係。

7.一個簡單功能的加密解密類別

class AMPCrypt {
    private static function getKey(){
        return md5(&#39;exampleKey&#39;);
     }
    public static function encrypt($value){
         $td = mcrypt_module_open(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
         mcrypt_generic_init($td, $key, $iv);
         $ret = base64_encode(mcrypt_generic($td, $value));
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);
        return $ret;
     }
    public static function dencrypt($value){
         $td = mcrypt_module_open(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
         mcrypt_generic_init($td, $key, $iv);
         $ret = trim(mdecrypt_generic($td, base64_decode($value))) ;
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);
        return $ret;
     }
}
登入後複製

以上是php mcrypt的加密解密實例代碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!