PHP 加密扩展 mcrypt 的基本使用_php8 支持国密吗-程序员宅基地

技术标签: 其它  数据加密  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, '', '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';
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012302539/article/details/58692259

智能推荐

golang知识图谱NLP实战第二节——解析依存句法分析结果_句法依存知识图谱-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏8次。 golang知识图谱NLP实战第一节——整体思路golang知识图谱NLP实战第二节——解析依存句法分析结果golang知识图谱NLP实战第三节——关系抽取1 参考资料基于依存句法分析的开放式中文实体关系抽取https://blog.csdn.net/heuguangxu/article/details/80088489基于神经网络的高性能依存句法分析器http://www...._句法依存知识图谱

EqualsBuilder和HashCodeBuilder和其它几个Builder工具类_hashcodebuilder 最多支持多少位-程序员宅基地

文章浏览阅读485次。http://www.blogjava.net/19851985lili/articles/95448.html自动化hashCode()和equals() 问题产生:当需要自动实现hashCode()和equals()方法 解决方法:使用EqualsBuilder和HashCodeBuilder 使用举例: import org.apache.common_hashcodebuilder 最多支持多少位

android自定义进度条百分比跟着走,Android自定义View实现水平带数字百分比进度条...-程序员宅基地

文章浏览阅读509次。这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下:思路如下:第一部分是左侧的蓝色直线,代表已经完成的进度;第二部分是右侧灰色的直线,代表未完成的进度;第三部分是红色的百分比的数字百分比文本,显示当前确切的完成进度。最关键的部分就是要确定百分比文本的确切位置,这里用了paint的getTextBounds方法,得到文本的宽高,然后..._android view 相对于屏幕百分比移动

【Python入门教程】第25篇 递归函数_编写一个递归函数 countdown,并从 n 开始倒数到 1,输出没一个数-程序员宅基地

文章浏览阅读948次,点赞2次,收藏6次。本篇我们学习 Python 递归函数,它可以简化我们的代码。递归函数(recursive function)是指可以自我调用的函数,递归函数需要定义一个停止自我调用的条件。_编写一个递归函数 countdown,并从 n 开始倒数到 1,输出没一个数

RocketMQ-消息发送源码分析(三)消息重试及Broker故障延迟机制_rocketmq的故障延迟机制-程序员宅基地

文章浏览阅读2.1k次,点赞6次,收藏8次。文章目录问题点消息重试消息队列选择默认机制Broker故障转移机制问题点上篇文章已经介绍了消息发送时,topic的路由信息是如何获取的,最终路由结果是一个TopicPublishInfo对象,其中messageQueueList就是本次消息发送的topic对应的消息队列,再看下TopicPublishInfo属性图加深印象问题又来了,拿到了消息队列后,就进入到了具体消息队列选择、发送的流程..._rocketmq的故障延迟机制

Android实现音乐播放器,Service后台播放&Notification控制播放状态_android后台播放音乐 no heads up: unimportant notificatio-程序员宅基地

文章浏览阅读4.4k次,点赞11次,收藏64次。前言CSDN和百度上有许多关于做音乐播放器的资料,但是基本上都只是贴上主要代码或者是要积分/C币,考虑到音乐播放器是比较基础的项目,也只有新手或者对这方面不了解的人才会来系统的学习,因此本篇博客由浅及深讲解,并把最终代码献上。本音乐播放器的功能:1.实现访问手机本地的.mp3音乐文件2.在主页中将访问的数据显示出来(这里简单点用ListView,用RecycleView当然也可以)3.在..._android后台播放音乐 no heads up: unimportant notification

随便推点

云计算技术与应用赛项试题库之docker运维题_创建/opt/xiandian目录,创建完成后启动名为xiandian-dir,镜像为nginx_l-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏4次。以下所使用的IP详情:服务端:192.168.182.50客户端:192.168.182.60根据提供的软件包,搭建rancher平台。通过curl命令查询Rancher管理平台首页,将以 上查询命令及结果输入答题框。curl http://192.168.182.50:8080/env/la5/apps/stacks根据提供的软件包,通过“应用商店”部署Gogs,修改网页访问端口为9093,通过curl命令访问用户列表,提交执行结果文本到答题框。curl http://192.168.182_创建/opt/xiandian目录,创建完成后启动名为xiandian-dir,镜像为nginx_latest.tar

查看webpack版本_webback版本-程序员宅基地

文章浏览阅读6.5w次,点赞7次,收藏14次。1,npm info webpack 2,webpack -v如果没有出现,npm install --global webpack-cli,因为注意:webpack 4x以上,webpack将命令相关的内容都放到了webpack-cli,所以还需要安装webpack-cli;之后再webpack -v ..._webback版本

Linux学习笔记:用户、用户组、文件系统和网络_gopher:x:13:30:gopher:/var/gopher:/sbin/nologin-程序员宅基地

文章浏览阅读748次。第2天——用户、用户组、文件系统和网络一、用户身份与用户组记录的文件二、用户与用户组操作三、文件或目录权限操作四、磁盘与文件系统五、网络配置与操作一、用户身份与用户组记录的文件在Linux系统当中,默认情况下所有的系统上的账号信息都记录在/etc/passwd这个文件内(包括root用户),而个人密码记录在/etc/shadow这个文件内。所有Linux的组..._gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

Android(OPhone) 学习笔记 - 按钮响应-程序员宅基地

文章浏览阅读286次。在经历了三个例子代码之后,我们进入系统的开发学习。如果大家都是按照前面的例子一步步操作下来的话,我相信大家对开发环境的配置、模拟器的操作有了一定的了解。从本篇文章开始,我在介绍时,不会像前面一样step by step地贴每一行代码,讲解每一个细节,如果有疑问的地方,可以留言或者邮件探讨。现在介绍按钮响应的两种方法:方法一: 在onCreate中添加如下代码Button

C++中typedef与const、指针_c++ typedef const-程序员宅基地

文章浏览阅读1.1k次。1 typedef的用法在C++中,typedef关键字用来定义类型的别名。typedef double wages;此时,wages是double的别名,可以将wages作为数据类型来定义其他变量。wages mywage;其中,mywage的类型是double。2 使用typedef定义指针的别名使用typedef定义指针的别名的方法与“1 typedef的用..._c++ typedef const

启动Linux上Weblogic Server报错: <BEA-141281> <unable to get file lock, will retry ...>_loki报错please fix or remove this file err recored f-程序员宅基地

文章浏览阅读6.3k次。Linux weblogic bea-141281_loki报错please fix or remove this file err recored from panic opening boltdb

推荐文章

热门文章

相关标签