使用php mcrypt加密解密
数字签名:对数据和私钥进行hash运算得到消息摘要,连同消息本身一块发给客户端。数据签名强调客户端接收到的数据是来自特定服务端,服务端具有对数据不可否认性。客户端通过确认此次签名的正确性来判断拿到的消息是否来自特定服务端。
数据加密:对数据进行加密,有对称加密和非对称加密两种。PHP中常使用 mcrypt和openssl扩展对数据进行加解密。mcrypt常用在对称加密中,openssl常用在非对称加密中。另外在编程中还经常使用到一种单项散列加密算法,比如MD5,HASH,SHA1,password_hash等对数据(通常是用户密码)进行加密,这种加密是不可解密的(理论上没有不可解密的算法,只是说解密的机器耗时较长便认为不可解密。一般情况下仍然可采用暴力字典破解和查找彩虹表的方式破解),hash单向加密一般会有个盐值。
在实际应用场景中,有只使用数据签名然后明文传输数据的(这是最多的),也有使用数据签名和加密数据进行传输的,一半很少只有数据加密而没有数据签名的情况吧。、
MCRYPT加密
首先明确这几个概念
算法名称:即 MCRYPT扩展所支持的密码算法,详细列表可参见mcrypt.c文件。mcypt支持的算法见文末。
算法模式:MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:”ecb”,”cbc”,”cfb”,”ofb”,”nofb” 和 “stream”。
算法模块:使用mcrypt_module_open()打开的指定算法和模式对应的模块,是一个资源类型
初始向量:加密时需要用到的一个参数,使用mcrypt_create_iv()从随机源创建
初始向量大小:是指由mcrypt_get_iv_size()返回的指定算法/模式组合的初始向量大小。mcrypt_create_iv()根据初始向量大小创建初始向量。
mcrypt加密解密需要以下几个步骤
加密:
1 使用mcrypt_module_open()打开指定算法和模式的对应模块。
2 mcrypt_get_iv_size()获得指定算法和模式的初始向量长度,或mcrypt_enc_get_iv_size($td)获取打开模块的初始向量长度。
3 根据初始向量长度创建初始向量 mcrypt_create_iv()
4 初始化加密所需的缓冲区 mcrypt_generic_init()
5 加密数据 mcrypt_generic()
6 结束加密,执行清理工作 mcrypt_generic_deinit()
解密需要以下几个步骤
1 初始化解密模块 mcrypt_generic_init()
2 解密数据 mcrypt_decrypt()
3 结束解密,执行清理工作 mcrypt_generic_deinit()
4 关闭开始时打开的模块 mcrypt_module_close
整个加解密的过程类似创建图片的过程,首先创建画布资源,创建颜色,填充,最后image_destroy一样。
然后来看一下上面提到的几个函数的用法
1.mcrypt_module_open — 打开算法和模式对应的模块
resource mcrypt_module_open ( string $algorithm , string $algorithm_directory , string $mode , string $mode_directory )
返回资源类型
参数说明见表 1-1
表1-1
| 参数 | 说明 |
| algorithm | MCRYPT_ciphername 常量中的一个,或者是字符串值的算法名称。见文末 |
| algorithm_directory | algorithm_directory 参数指示加密模块的位置。 如果你提供此参数,则使用你指定的值。 如果将此参数设置为空字符串(””),将使用 php.ini 中的 mcrypt.algorithms_dir 。 如果不指定此参数,则使用 libmcrypt 的编译路径 (通常是 /usr/local/lib/libmcrypt)。 |
| mode | MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:”ecb”,”cbc”,”cfb”,”ofb”,”nofb” 和 “stream”。 |
| mode_directory | algorithm_directory 参数指示加密模式的位置。 如果你提供此参数,则使用你指定的值。 如果将此参数设置为空字符串(””),将使用 php.ini 中的 mcrypt.modes_dir 。 如果不指定此参数,则使用 libmcrypt 的编译路径 (通常是 /usr/local/lib/libmcrypt)。 |
2.mcrypt_get_iv_size — 返回指定算法/模式组合的初始向量大小
int mcrypt_get_iv_size ( string $cipher , string $mode )
返回初始向量大小
可使用mcrypt_enc_get_iv_size($td) 代替,$td可以是由 mcrypt_module_open() 返回的资源作为参数。
参数说明见表 1-2
表1-2
| 参数 | 说明 |
| cipher | MCRYPT_ciphername 常量中的一个,或者是字符串值的算法名称。 |
| mode | MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:”ecb”,”cbc”,”cfb”,”ofb”,”nofb” 和 “stream”。 |
3.mcrypt_create_iv — 从随机源创建初始向量
string mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] )
返回初始向量
表1-3
| 参数 | 说明 |
| size | 初始向量大小。可由mcrypt_get_iv_size或mcrypt_enc_get_iv_size获得 |
| source | 初始向量数据来源。可选值有: MCRYPT_RAND (系统随机数生成器), MCRYPT_DEV_RANDOM (从 /dev/random 文件读取数据) 和 MCRYPT_DEV_URANDOM (从 /dev/urandom 文件读取数据)。 在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。 |
4.mcrypt_generic_init — 初始化加密所需的缓冲区
int mcrypt_generic_init ( resource $td , string $key , string $iv )
如果发生错误,将会返回负数: -3 表示密钥长度有误,-4 表示内存分配失败, 其他值表示未知错误, 同时会显示对应的警告信息。 如果传入参数不正确,返回 FALSE。
表1-4
| 参数 | 说明 |
| td | 加密描述符。由mcrypt_module_open获得的资源类型 |
| key | 调用 mcrypt_enc_get_key_size() 函数获得的密钥最大长度。 小于最大长度的数值都被视为非法参数。 |
| iv | 通常情况下,向量大小等于算法的分组大小, 但是你应该通过 mcrypt_enc_get_iv_size() 函数 来获得这个值。在 ECB 模式下,初始向量会被忽略, 在 CFB,CBC,STREAM,nOFB 和 OFB 模式下,必须提供初始向量。 初始向量要求是随机的,并且是唯一的(不需要是安全的)。 加密和解密必须使用相同的初始向量。 如果你不想使用初始向量,请将其设置为全 0 值,但是不建议你这么做。 |
5.mcrypt_generic — 加密数据
string mcrypt_generic ( resource $td , string $data )
返回加密后的数据
表1-5
| 参数 | 说明 |
| td | 加密描述符。由mcrypt_module_open获得的资源类型 |
| data | 要加密的数据 |
6.mdecrypt_generic — 解密数据
string mdecrypt_generic ( resource $td , string $data )
返回解密后的字符串
请注意,由于存在数据补齐的情况, 返回字符串的长度可能和明文的长度不相等
参数 td 加密描述符。由mcrypt_module_open获得的资源类型,data是需要解密的密文
6.mcrypt_generic_deinit — 对加密模块进行清理工作
bool mcrypt_generic_deinit ( resource $td )
参数 td 加密描述符。由mcrypt_module_open获得的资源类型
本函数终止由加密描述符(td)指定的加密模块, 它会清理缓冲区,但是并不关闭模块。 要想关闭加密模块, 你需要自行调用 mcrypt_module_close() 函数。 (但是 PHP 会在脚本末尾为你关闭已打开的加密模块)
7.mcrypt_module_close — 关闭加密模块
bool mcrypt_module_close ( resource $td )
参数 td 加密描述符。由mcrypt_module_open获得的资源类型
mcrypt加解密属于对称加密���算法是公开的,其安全性是来自对秘钥的保密。用户可选择不同的算法名称和算法模式。常用的算法是MCRYPT_RIJNDAEL_128,MCRYPT_DES,rijndael-256等,常用的模式是 cbc,ecb
php中支持的算法如下:
MCRYPT_3DES
MCRYPT_ARCFOUR_IV ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_ARCFOUR ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_BLOWFISH
MCRYPT_CAST_128
MCRYPT_CAST_256
MCRYPT_CRYPT
MCRYPT_DES
MCRYPT_DES_COMPAT ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_ENIGMA ( 仅 libmcrypt > 2.4.x 可用,MCRYPT_CRYPT 的别名)
MCRYPT_GOST
MCRYPT_IDEA (非免费算法)
MCRYPT_LOKI97 ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_MARS ( 仅 libmcrypt > 2.4.x 可用,非免费算法)
MCRYPT_PANAMA ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_RIJNDAEL_128 ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_RIJNDAEL_192 ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_RIJNDAEL_256 ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_RC2
MCRYPT_RC4 ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_RC6 ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_RC6_128 ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_RC6_192 ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_RC6_256 ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_SAFER64
MCRYPT_SAFER128
MCRYPT_SAFERPLUS ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_SERPENT( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_SERPENT_128 ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_SERPENT_192 ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_SERPENT_256 ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_SKIPJACK ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_TEAN ( 仅 libmcrypt 2.2.x 可用 )
MCRYPT_THREEWAY
MCRYPT_TRIPLEDES ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_TWOFISH ( mcrypt 2.x 之前的版本,或者 2.4.x 之后版本可用 )
MCRYPT_TWOFISH128 (TWOFISHxxx 在新的 2.x 版本可用,但在 2.4.x 版本不可用)
MCRYPT_TWOFISH192
MCRYPT_TWOFISH256
MCRYPT_WAKE ( 仅 libmcrypt > 2.4.x 可用 )
MCRYPT_XTEA ( 仅 libmcrypt > 2.4.x 可用 )
使用php mcrypt加密解密的更多相关文章
- mcrypt加密以及解密过程
Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示 Mcrypt扩展库可以实现加密解密功能 ...
- Go加密解密之DES
一.DES简介 DES(Data Encryption Standard)是对称加密算法,也就是加密和解密用相同的密钥.其入口参数有三个:key.data.mode.key为加密解密使用的密钥,dat ...
- php des 加密解密实例
des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展库 $iv_size = mcrypt_ ...
- PHP mcrypt加密扩展使用总结
在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密.PHP中有提供了mcrypt的这样一个加密扩展实现对数据的加密解密. 一.mcrypt扩展的安装 在低版本的PHP中需要在配置文件 ...
- PHP使用DES进行加密解密
DES是一种对称加密算法,也就是通过密文和合法的密钥能够将明文还原出来,在程序开发过程中有些 接口可能需要获取原始数据,而发送的数据又比较敏感(比如用户的密码等信息),这时可以选择DES加密算法,DE ...
- golang实现aes-cbc-256加密解密过程记录
我为什么吃撑了要实现go的aes-cbc-256加密解密功能? 之前的项目是用php实现的,现在准备用go重构,需要用到这个功能,这么常用的功能上网一搜一大把现成例子,于是基于go现有api分分钟实现 ...
- android&php 加密解密
from://http://blog.csdn.net/hecker385/article/details/6717647 android&php 加密解密 分类: Php Android20 ...
- PHP 7中利用OpenSSL代替Mcrypt加解密的方法详解
php7.1发布后新特性吸引了不少PHPer,大家都在讨论新特性带来的好处与便利.但是从php7.0 升级到 php7.1 废弃(过时)了一个在过去普遍应用的扩展(mcrypt扩展).官方提供了相应的 ...
- php实现cookie加密解密
1.加密解密类 class Mcrypt { /** * 解密 * * @param string $encryptedText 已加密字符串 * @param string $key 密钥 * @r ...
随机推荐
- 用JS制作博客页面背景随滚动渐变的效果
今天颓了一会,用JavaScript给我的博客园博客写了一个页面背景随滚动而渐变的效果,做完之后自我感觉良好-- 下面就以我的博客园博客为例,介绍一下如何制作这个效果! 准备 [x] 申请博客园的JS ...
- BZOJ 百题纪念!
一百题辣! 现在NOI知识点中最基础的那部分已经学完了--这几天发现自己会写SA啊树剖啊可持久化Trie啊之类模板题--还挺开心的-- 逛了两天学长博客之后--BZOJ100题辣--也挺开心的-- 现 ...
- luogu1941 [NOIp2014]飞扬的小鸟 (dp)
设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系 ...
- 《剑指offer》— JavaScript(34)第一个只出现一次的字符
第一个只出现一次的字符 题目描述 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置. *** 思路 新建一个对象,其中key用 ...
- 带你正确的使用List的retainAll方法求交集
一. retainAll 方法 public boolean retainAll(Collection<?> c) { //调用自己的私有方法 return batchRemove(c, ...
- POJ 2965 The Pilots Brothers' refrigerator (暴力枚举)
https://vjudge.net/problem/POJ-2965 与poj-1753相似,只不过这个要记录路径.poj-1753:https://www.cnblogs.com/fht-lito ...
- sql查询语句优化
http://www.cnblogs.com/dubing/archive/2011/12/09/2278090.html 最近公司来一个非常虎的dba 10几年的经验 这里就称之为蔡老师吧 在征得 ...
- [BZOJ 1013][JSOI 2008] 球形空间产生器sphere 题解(高斯消元)
[BZOJ 1013][JSOI 2008] 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面 ...
- Django用ajax进行post请求
post请求有两种,跨域和不跨域 1.不跨域 # 不跨域的 view.py def re_json(request): print(request.POST['name']) p1 = Product ...
- WIN10文件无法自动刷新问题解决方法
Window10系统有时候会遇到以下类似的问题 1.文件删除后,图标还在,无法自动刷新屏幕,按F5或右键菜单刷新后才消失 2.文件粘贴后,不显示,刷新后才显示 3.回收站清理后,文件图标仍显示有垃圾 ...