使用php mcrypt加密解密

  

<强>数字签名:对数据和私钥进行散列运算得到消息摘要,连同消息本身一块发给客户端。数据签名强调客户端接收到的数据是来自特定服务端,服务端具有对数据不可否认性。客户端通过确认此次签名的正确性来判断拿到的消息是否来自特定服务端。


<强>数据加密:对数据进行加密,有对称加密和非对称加密两种。php中常使用mcrypt和openssl扩展对数据进行加解密.mcrypt常用在对称加密中,openssl常用在非对称加密中。另外在编程中还经常使用到一种单项散列加密算法,比,如MD5散列,SHA1, password_hash等对数据(通常是用户密码)进行加密,这种加密是不可解密的(理论上没有不可解密的算法,只是说解密的机器耗时较长便认为不可解密。一般情况下仍然可采用暴力字典破解和查找彩虹表的方式破解),散列单向加密一般会有个盐值。


在实际应用场景中,有只使用数据签名然后明文传输数据的(这是最多的),也有使用数据签名和加密数据进行传输的,一半很少只有数据加密而没有数据签名的情况吧。



首先明确这几个概念

<强>算法名称:即mcrypt扩展所支持的密码算法,详细列表可参见mcrypt。c文件.mcypt支持的算法见文末。

<强>算法模式: MCRYPT_MODE_modename常量中的一个,或以下字符串中的一个:“央行”,“cbc”、“招标文件”、“富含”b,“nofb”和“流”。

<强>算法模块:使用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


整个加解密的过程类似创建图片的过程,首先创建画布资源,创建颜色,填充,最后p_w_picpath_destroy一样。


然后来看一下上面提到的几个函数的用法

1。mcrypt_module_open——打开算法和模式对应的模块

资源mcrypt_module_open(字符串算法,美元字符串algorithm_directory美元,美元字符串模式,字符串mode_directory美元)

返回资源类型

参数说明见表1-1 

表1-1 

参数说明algorithmMCRYPT_ciphername常量中的一个,或者是字符串值的算法名称。见文末algorithm_directoryalgorithm_directory参数指示加密模块的位置。如果你提供此参数,则使用你指定的值。如果将此参数设置为空字符串(" "),将使用php。ini中的mcrypt。algorithms_dir。如果不指定此参数,则使用libmcrypt的编译路径(通常是/usr/local/lib/libmcrypt) .modeMCRYPT_MODE_modename常量中的一个,或以下字符串中的一个:“央行”,“cbc”、“招标文件”、“富含”b,“nofb”和“流”.mode_directoryalgorithm_directory参数指示加密模式的位置。如果你提供此参数,则使用你指定的值。如果将此参数设置为空字符串(" "),将使用php。ini中的mcrypt。modes_dir。如果不指定此参数,则使用libmcrypt的编译路径(通常是/usr/local/lib/libmcrypt)。


2。mcrypt_get_iv_size -返回指定算法/模式组合的初始向量大小

int mcrypt_get_iv_size(字符串密码美元,字符串模式美元)

返回初始向量大小

可使用mcrypt_enc_get_iv_size (td)代替,td美元可以是由mcrypt_module_open()返回的资源作为参数。

参数说明见表1 - 2

表1-2 

参数说明cipherMCRYPT_ciphername常量中的一个,或者是字符串值的算法名称.modeMCRYPT_MODE_modename常量中的一个,或以下字符串中的一个:“央行”,“cbc”、“招标文件”、“富含”b,“nofb”和“流”。


3。mcrypt_create_iv——从随机源创建初始向量

使用php mcrypt加密解密