Mcrypt 支援以下四種分組密碼模式:CBC, OFB,CFB和 ECB。 如果使用 libmcrypt-2.4.x 或更高版本鏈接, 還可以
#支援 nOFB 分組模式 和 流 模式。 下列是所支援的加密模式以及其對應的預先定義常數。
1. MCRYPT_MODE_ECB (electronic codebook) 適用於隨機數據, 例如可以用這種模式來加密其他金鑰。 由於要加密
的資料很短,而且是隨機的,所以這種模式的缺點反而起到了積極的作用。
2. MCRYPT_MODE_CBC (cipher block chaining) 特別適用於檔案加密。 相較於 ECB, 它的安全性有明顯提升。
3. MCRYPT_MODE_CFB (cipher feedback) 對於每個單獨的位元組都進行加密, 所以非常適合針對位元組流的加密。
4. MCRYPT_MODE_OFB (output feedback, in 8bit) 和 CFB 類似。它可以用在無法容忍加密錯誤傳播的應用程式中。因為
它是按照 8 個位元位元進行加密的,所以安全係數較低,不建議使用。
5. MCRYPT_MODE_NOFB (output feedback, in nbit) 和OFB 類似,但更安全,因為它可以按照演算法指定的分組
#大小來對資料進行加密。
6. MCRYPT_MODE_STREAM 是一種擴展模式,它包含了諸如 "WAKE" 或 "RC4" 的流加密演算法。
#
<?php // 获取支持的加密算法 $algos = mcrypt_list_algorithms(); print_r($algos); // 获取所支持的模式 $modes = mcrypt_list_modes(); print_r($modes);
自PHP5.5.0 開始被廢棄的幾個方法,不建議再使用:
mcrypt_cfc()
mcrypt_cfb()
mcrypt_ecb()
mcrypt_ofb();
範例一:
<?php /** * 加密 * @param $plainText 明文数据 * @param $key 加密key */ function encrypt($plainText, $key) { $algo = MCRYPT_RIJNDAEL_256; //加密算法 $ecb = MCRYPT_MODE_ECB; //加密模式 $keysize = mcrypt_get_key_size($algo, $ecb); $key = substr($key, 0, $keysize); //确保key的长度有效 $ivSize = mcrypt_get_iv_size($algo, $ecb); // 参数 2 可选值有:MCRYPT_RAND(系统随机数生成器), MCRYPT_DEV_RANDOM(从 /dev/random 文件读取数据) // 和 MCRYPT_DEV_URANDOM(从 /dev/urandom 文件读取数据)。在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。 // 请注意,在 PHP 5.6.0 之前的版本中, 此参数的默认值为 MCRYPT_DEV_RANDOM。 $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); //从随机源创建初始向量 $encryptText = mcrypt_encrypt($algo, $key, $plainText, $ecb, $iv); return trim(base64_encode($encryptText)); } /** * 解密 * @param encryptedText 密文数据 * @param $key 解密key */ function decrypt($encryptedText, $key) { $algo = MCRYPT_RIJNDAEL_256; $ecb = MCRYPT_MODE_ECB; $keysize = mcrypt_get_key_size($algo, $ecb); $key = substr($key, 0, $keysize); //确保key的长度有效 $cryptText = base64_decode($encryptedText); $ivSize = mcrypt_get_iv_size($algo, $ecb); $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); $decryptText = mcrypt_decrypt($algo, $key, $cryptText, $ecb, $iv); return trim($decryptText); }
範例二:
<?php /** * 数据加密 * @param $plainText 明文数据 * @param $key 加密key */ function encrypt($plainText, $key) { $td = mcrypt_module_open(MCRYPT_3DES, '', 'ecb', ''); // MCRYPT_3DES = tripledes $size = mcrypt_enc_get_iv_size($td); // 返回打开的算法的初始向量大小 $iv = mcrypt_create_iv($size, MCRYPT_RAND); // 从随机源创建初始向量 $key = substr($key, 0 ,mcrypt_enc_get_key_size($td)); // 打开模式所能支持的最长密钥长度 // 初始化加密所需的缓冲区 // 如果发生错误将会返回负数: -3表示密钥长度有误, -4表示内存分配失败, 其他值表示未知错误, 同时会显示对应的警告信息 $retInt = mcrypt_generic_init($td, $key, $iv); $encrypt_data = mcrypt_generic($td, $plainText); //加密 mcrypt_generic_deinit($td); // 对加密模块进行清理工作 mcrypt_module_close($td); // 关闭加密模块 return base64_encode($encrypt_data); } /** * 数据解密 * @param $encryptData 密文数据 * @param $key 解密key */ function decrypt($encryptData, $key) { $encryptData = base64_decode($encryptData); $td = mcrypt_module_open('tripledes', '', 'ecb', ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //从随机源创建初始向量 $key = substr($key, 0, mcrypt_enc_get_key_size($td)); $retInt = mcrypt_generic_init($td, $key, $iv); // 请注意,由于存在数据补齐的情况,返回字符串的长度可能和明文的长度不相等 $plainText = mdecrypt_generic($td, $encryptData); // 解密 mcrypt_generic_deinit($td); // 对加密模块进行清理工作 mcrypt_module_close($td); // 关闭加密模块 return $plainText; } // 解决数据补齐,造成返回字符串长度和明文长度不一致的问题 $origin_plain = ''; //原始的明文 $plainText = ''; //解密后得到的明文 if (strncmp($origin_plain, $plainText, strlen($origin_plain)) == 0) { echo 'ok'; } else { echo 'error'; }
以上是具體介紹PHP加密擴充mcrypt的基本使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!