程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php基於mcrypt的加密解密實例,mcrypt加密解密實例

php基於mcrypt的加密解密實例,mcrypt加密解密實例

編輯:關於PHP編程

php基於mcrypt的加密解密實例,mcrypt加密解密實例


本文實例講述了php基於mcrypt實現加密解密的方法。分享給大家供大家參考。具體實現方法如下:

PHP中自帶了相當多的加密的方法,這裡我們來看一下mcrypt擴展的使用方式。也是在工作中需要用這個東西加密訪問用戶的Cookie的值,認真的學習了這個方面的內容。

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'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'clock at the secret place.";
    // 打開mcrypt,或者mcrypt類型的資源對象,該對象使用ecb模式,使用3des作為加密算法。
    $td = mcrypt_module_open('tripledes', '', 'ecb', '');
    // 創建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('exampleKey');
     }
    public static function encrypt($value){
         $td = mcrypt_module_open('tripledes', '', 'ecb', '');
         $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('tripledes', '', 'ecb', '');
         $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程序設計有所幫助。


php 代碼解密

其實你可以使用DES進行解密,php中有一個擴展可以支持DES的加密算法,是:extension=php_mcrypt.dll在配置文件中將這個擴展打開還不能夠在windows環境下使用需要將PHP文件夾下的 libmcrypt.dll 拷貝到系統的 system32 目錄下,這是通過phpinfo可以查看到mcrypt表示這個模塊可以正常試用了。
我舉例一下吧:
function do_mdecrypt($input, $key)
{
$input = str_replace(""n", "", $input);
$input = str_replace(""t", "", $input);
$input = str_replace(""r", "", $input);

$input = trim(chop(base64_decode($input)));
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$key = substr(md5($key), 0, 24);

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$decrypted_data = mdecrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return trim(chop($decrypted_data));

}
然後,你用用這個方法,就可以實現代碼解密了!
 

php加密算法的一些疑問

1、加密算法是MCRYPT_RIJNDAEL_128,至於是不是你說的AES,就不好說了。我個人認為應該不是。畢竟兩者長得不太像。

2、代碼沒有硬傷,但是所有加密都有可能被破的,窮舉法耗時問題而已。
3、IV用於初始化算法用的。一樣需要保密。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved