php encrypt加密和解密,php中关于openssl_encrypt的加密和解密
1、DES介绍
DES 是对称性加密里面常见一种,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥会被忽略。
a、跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。
b、常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。
c、加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。
2、加密方法
openssl_encrypt($data, $method, $password, $options, $iv)
参数说明:
$data 加密明文
$method 加密方法
1、DES-ECB
2、DES-CBC
3、DES-CTR
4、DES-OFB
5、DES-CFB
$passwd 加密密钥[密码]
$options 数据格式选项(可选)【选项有:】
1、0
2、OPENSSL_RAW_DATA=1
3、OPENSSL_ZERO_PADDING=2
4、OPENSSL_NO_PADDING=3
$iv 密初始化向量(可选)
3、解密方法
openssl_decrypt($data, $method, $password, $options, $iv)
参数说明:
$data 要解密的数据
其他参数同加密方法
4、用法案例
参数:
$data = '1234567887654321';//加密明文
$method = 'DES-ECB';//加密方法
$passwd = '12344321';//加密密钥
$options = 0;//数据格式选项(可选)
$iv = '';//加密初始化向量(可选)
(1) 默认填充方式
//加密:
$result = openssl_encrypt($data, $method, $passwd, $options);var_dump($result);//结果:string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"
//解密
$result = 'kQYOdswcm9I5elv2wdJucplqAgqDNqXg';var_dump(openssl_decrypt($result, $method, $passwd, 0));//结果:string(16) "1234567887654321"
(2) OPENSSL_RAW_DATA方式【会用PKCS#7进行补位】
//加密
$result = openssl_encrypt($data, $method, $passwd,OPENSSL_RAW_DATA);var_dump($result);//结果:string(24) "� v� ��9z[���nr�j �6��"
//我们可以看到结果是乱码的,这时我们需要base64一下
$result = openssl_encrypt($data, $method, $passwd,OPENSSL_RAW_DATA);var_dump(base64_encode($result));//这时结果是 string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"
//解密
result = openssl_encrypt($data, $method, $passwd,OPENSSL_RAW_DATA);var_dump(openssl_decrypt($result, $method,$passwd,OPENSSL_RAW_DATA));//结果:string(16) "1234567887654321"
我们可以看到:默认填充方式与OPENSSL_RAW_DATA,这两种方式加密结果是一样的
(3) OPENSSL_ZERO_PADDING方式
//加密
$result = openssl_encrypt($data, $method, $passwd,OPENSSL_ZERO_PADDING);var_dump($result);//结果:string(24) "kQYOdswcm9I5elv2wdJucg=="
//解密:
$result = openssl_encrypt($data, $method, $passwd,OPENSSL_ZERO_PADDING);var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_ZERO_PADDING));//结果:string(16) "1234567887654321"
(4) OPENSSL_NO_PADDING【不填充,需要手动填充】
//在openssl_encrypt前加上填充过程
//加密
$str_padded = $data;if (strlen($str_padded) % 16) {$str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");
}$result = openssl_encrypt($str_padded, $method, $passwd,OPENSSL_NO_PADDING);var_dump($result);echo '
';var_dump( base64_encode($result));//结果:
//string(16) "� v� ��9z[���nr"
//string(24) "kQYOdswcm9I5elv2wdJucg=="
//我们可以看到结果是加密的乱码,需要用base64一下,就可以看到结果了
//加密begin
$str_padded = $data;if (strlen($str_padded) % 16) {$str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");
}$result = openssl_encrypt($str_padded, $method, $passwd,OPENSSL_NO_PADDING);//加密end
//解密begin
$str = base64_encode($result);$m = openssl_decrypt( base64_decode($str) , $method, $passwd,OPENSSL_NO_PADDING);var_dump( rtrim( rtrim( $m,chr(0) ), chr(7) ) );//解密 end
//结果:string(16) "1234567887654321"
** 结尾要去除填充字符’\0’和’\a’。
‘\a’是为了兼容用OPENSSL_RAW_DATA加密的结果。 **
示例用法
classAes
{public $key = '';public $iv = '';public function __construct($config)
{foreach($config as $k => $v){$this->$k = $v;
}
}//加密
public function aesEn($data){return base64_encode(openssl_encrypt($data, $this->method,$this->key, OPENSSL_RAW_DATA , $this->iv));
}//解密
public function aesDe($data){return openssl_decrypt(base64_decode($data), $this->method, $this->key, OPENSSL_RAW_DATA, $this->iv);
}
}$config =['key' => 'reter4446fdfgdfgdfg', //加密key
'iv' => md5(time(). uniqid(),true), //保证偏移量为16位
'method' => 'AES-128-CBC' //加密方式 # AES-256-CBC等
];$obj = new Aes($config);$res = $obj->aesEn('aaaddee44');//加密数据
echo $res;echo '
';echo $obj->aesDe($res);//解密
php encrypt加密和解密,php中关于openssl_encrypt的加密和解密相关推荐
- javascript 解密_Javascript中的AES加密和Java中的解密
javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...
- python调用库函数用ecb模式加密图片_AES中ECB模式的加密与解密(Python3.7)
本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...
- python 加密解密_Python中的加密和解密
1.base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形 ...
- python实现md5加密和解密_Python中的加密和解密
1.base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形 ...
- Word控件Spire.Doc 【加密解密】教程(一):在 C#、VB.NET 中使用自定义密码加密、解密、保护 Word
Word 加密是保护 Word 文档的一种方法,它要求用户为文档提供密码.没有密码,加密文件无法打开.本指南中的解决方案演示了如何通过 Spire.Doc for .NET 在 C# 和 VB.NET ...
- php中的base64,php中base64_decode与base64_encode加密解密函数
php中base64_decode与base64_encode加密解密函数,实例分析了base64加密解密函数的具体用法,具有一定的实用价值,需要的朋友可以参考下 本文实例讲述了php中base64_ ...
- springboot中的后端接口加密解密
近期在项目中因为安全红线要求需要进行接口加解密,在此记录一下. 通过@ControllerAdvice扫描所有接口进行接口加密以及接口解密,本文选择的是AES加密,通过密匙及偏移量加密接口数据. 一. ...
- Web.config中连接字符串的加密和解密
Web.config中连接字符串的加密和解密 我们采用命令行的方式进行加密和解密.使用ASP.NET2.0提供的命令行工具aspnet_regiis.exe,该应用程序位系统目录下Microsoft ...
- java中完成md5加密解密_java实现md5加密解密 notNET中加密和解密的实现方法
java实现md5加密解密 notNET中加密和解密的实现方法 亦或是旅途风光 7-14 1918℃ 22 [ ee21.cn - ASP.NET ] .NET将原来独立的API和SDK合并到一个框架 ...
最新文章
- iOS开发 - 线程与进程的认识与理解
- Bruce Eckel教你如何爬出 Gradle 的“坑”?
- java中的访问修饰符
- 入门十大Python机器学习算法(附代码)
- mysql开发java心得_关于mysql 一些优化心得
- [scikit-learn 机器学习] 7. 朴素贝叶斯
- java中IO流的标准异常处理代码
- Elasticsearch——filter过滤查询
- 凉凉了,Eureka 宣布闭源,Spring Cloud 何去何从? 1
- 【翻译】GRAIL-手写识别
- Andrew Ng(coursera)单变量线性回归(LINEAR REGRESSION WITH ONE VARIABLE)
- Android TextView 实现文字大小不同和文字颜色不同
- 计算机控制系统功能,计算机控制系统功能之操作指导-电脑自学网
- spring 处理request.getInputStream()输入流只能读取一次问题
- 微信付款为什么无法连接服务器,前台微信付款报错:无法连接服务器,请检查网络连接?...
- Android 11 system_server 读写 SDCARD
- 推杆如妻子,发球木如情人,短铁如父母,球道木如朋友,长铁如兄弟
- buuctf刷题记录(6)
- 中文单栏latex模板
- Java版本的有趣代号
热门文章
- 去掉局域网共享文件夹下的“小手\ 图标
- 触漫显示服务器正在升级怎么办,谁说自拍不直出?旷视科技携手联想Z5s用AI微整形让你一键变靓...
- Qimage Ultimate 2021
- 小游戏 计算鼠标按下抬起的时间 按出2s整
- 【ThreeJS基础教程-高级几何体篇】2.6.1 BufferGeometry应用1-物体居中与包围盒的应用
- Android我自己的简易(秒表)计时器Chronometer
- 国内最完美的sll远程连接工具-finalshell
- Linux远程连接工具之ssh客户端
- 前端之路:bootstrap 好看漂亮的按钮设计。
- git clone出现 fatal: unable to access ‘https://github.com/...‘的解决办法