搜索
首页后端开发php教程具体介绍PHP加密扩展mcrypt的基本使用

Mcrypt 支持以下四种分组密码模式:CBC, OFBCFB 和 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, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;); // 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(&#39;tripledes&#39;, &#39;&#39;, &#39;ecb&#39;, &#39;&#39;);
	$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 = &#39;&#39;; //原始的明文
$plainText = &#39;&#39;; //解密后得到的明文
if (strncmp($origin_plain, $plainText, strlen($origin_plain)) == 0) {
	echo &#39;ok&#39;;
} else {
	echo &#39;error&#39;;
}

以上是具体介绍PHP加密扩展mcrypt的基本使用的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP中的依赖注入:避免常见的陷阱PHP中的依赖注入:避免常见的陷阱May 16, 2025 am 12:17 AM

DependencyInjection(DI)inPHPenhancescodeflexibilityandtestabilitybydecouplingdependencycreationfromusage.ToimplementDIeffectively:1)UseDIcontainersjudiciouslytoavoidover-engineering.2)Avoidconstructoroverloadbylimitingdependenciestothreeorfour.3)Adhe

如何加快PHP网站:性能调整如何加快PHP网站:性能调整May 16, 2025 am 12:12 AM

到Improveyourphpwebsite的实力,UsEthestertate:1)emplastOpCodeCachingWithOpcachetCachetOspeedUpScriptInterpretation.2)优化的atabasequesquesquesquelies berselectingOnlynlynnellynnessaryfields.3)usecachingsystemssslikeremememememcachedisemcachedtoredtoredtoredsatabaseloadch.4)

通过PHP发送大规模电子邮件:有可能吗?通过PHP发送大规模电子邮件:有可能吗?May 16, 2025 am 12:10 AM

是的,itispossibletosendMassemailswithp.1)uselibrarieslikeLikePhpMailerorSwiftMailerForeffitedEmailSending.2)enasledeLaysBetemailStoavoidSpamflagssspamflags.3)sylectynamicContentToimpovereveragement.4)

PHP中依赖注入的目的是什么?PHP中依赖注入的目的是什么?May 16, 2025 am 12:10 AM

DependencyInjection(DI)inPHPisadesignpatternthatachievesInversionofControl(IoC)byallowingdependenciestobeinjectedintoclasses,enhancingmodularity,testability,andflexibility.DIdecouplesclassesfromspecificimplementations,makingcodemoremanageableandadapt

如何使用PHP发送电子邮件?如何使用PHP发送电子邮件?May 16, 2025 am 12:03 AM

使用PHP发送电子邮件的最佳方法包括:1.使用PHP的mail()函数进行基本发送;2.使用PHPMailer库发送更复杂的HTML邮件;3.使用SendGrid等事务性邮件服务提高可靠性和分析能力。通过这些方法,可以确保邮件不仅到达收件箱,还能吸引收件人。

如何计算PHP多维数组的元素总数?如何计算PHP多维数组的元素总数?May 15, 2025 pm 09:00 PM

计算PHP多维数组的元素总数可以使用递归或迭代方法。1.递归方法通过遍历数组并递归处理嵌套数组来计数。2.迭代方法使用栈来模拟递归,避免深度问题。3.array_walk_recursive函数也能实现,但需手动计数。

PHP中do-while循环有什么特点?PHP中do-while循环有什么特点?May 15, 2025 pm 08:57 PM

在PHP中,do-while循环的特点是保证循环体至少执行一次,然后再根据条件决定是否继续循环。1)它在条件检查之前执行循环体,适合需要确保操作至少执行一次的场景,如用户输入验证和菜单系统。2)然而,do-while循环的语法可能导致新手困惑,且可能增加不必要的性能开销。

PHP中如何哈希字符串?PHP中如何哈希字符串?May 15, 2025 pm 08:54 PM

在PHP中高效地哈希字符串可以使用以下方法:1.使用md5函数进行快速哈希,但不适合密码存储。2.使用sha256函数提高安全性。3.使用password_hash函数处理密码,提供最高安全性和便捷性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。