PHP实现的AES 128位加密算法示例


Posted in PHP onSeptember 16, 2019

本文实例讲述了PHP实现的AES 128位加密算法。分享给大家供大家参考,具体如下:

/*
加密算法一般分为两种:对称加密算法和非对称加密算法。
对称加密
对称加密算法是消息发送者和接收者使用同一个密匙,发送者使用密匙加密了文件,
接收者使用同样的密匙解密,获取信息。常见的对称加密算法有:des/aes/3des.
对称加密算法的特点有:速度快,加密前后文件大小变化不大,但是密匙的保管是个大问题
,因为消息发送方和接收方任意一方的密匙丢失,都会导致信息传输变得不安全。
非对称加密
与对称加密相对的是非对称加密,非对称加密的核心思想是使用一对相对的密匙
分为公匙和私匙,私匙自己安全保存,而将公匙公开。公钥与私钥是一对,如果用公钥对数据进行加密,
只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密发送数据前只需要使用接收方的公匙加密就行了。
常见的非对称加密算法有RSA/DSA:非对称加密虽然没有密匙保存问题,但其计算量大,加密速度很慢,有时候我们还需要对大块数据进行分块加密。
数字签名
为了保证数据的完整性,还需要通过散列函数计算得到一个散列值,这个散列值被称为数字签名。其特点有:
无论原始数据是多大,结果的长度相同的;
输入一样,输出也相同;
对输入的微小改变,会使结果产生很大的变化;
加密过程不可逆,无法通过散列值得到原来的数据;
常见的数字签名算法有md5,hash1等算法。
PHP的openssl扩展
openssl扩展使用openssl加密扩展包,封装了多个用于加密解密相关的PHP函数,极大地方便了对数据的加密解密。 常用的函数有:
对称加密相关:
string openssl_encrypt ( string $data , string $method , string $password)
其中$data为其要加密的数据,$method是加密要使用的方法,$password是要使用的密匙,函数返回加密后的数据;
其中$method列表可以使用openssl_get_cipher_methods()来获取
其解密函数为 string openssl_encrypt ( string $data , string $method , string $password)
非对称加密相关:
它们都只需要传入证书文件(一般是.pem文件);
使用公匙加密数据,其中$data是要加密的数据;$crypted是一个引用变量,加密后的数据会被放入这个变量中;$key是要传入的公匙数据;
由于被加密数据分组时,有可能不会正好为加密位数bit的整数倍,所以需要$padding(填充补齐),
$padding的可选项有 OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING,分别为PKCS1填充,或不使用填充;
签名函数:$data为要签名的数据;$signature为签名结果的引用变量;$priv_key_id为签名所使用的私匙;$signature_alg为签名要使用的算法
,其算法列表可以使用openssl_get_md_methods()得到
验签函数:与签名函数相对,只不过它要传入与私匙对应的公匙;其结果为签名验证结果,1为成功,0为失败,-1则表示错误;
 * */
/*
 * 基于百度云API的例子
 * 密码一律采用AES 128位加密算法进行加密,用SK的前16位作为密钥,
 * 加密后生成的二进制字节流需要转成十六进制,并以字符串的形式传到服务端
 * */
function aes128WithFirst16Char($adminPass, $secretAccessKey)
{
  $adminPass = pkcs5Pad($adminPass);
  //把key值截取成16位的
  $secretAccessKey = substr($secretAccessKey, 0, 16);
  //进行AES加密
  $crypted = openssl_encrypt($adminPass, 'AES-128-ECB', $secretAccessKey, OPENSSL_RAW_DATA);
  //把字符串转换为16进制
  return bin2hex(substr($crypted, 0, 16));
}
//把密码填充成16位
function pkcs5Pad($adminPass)
{
  $pad = 16 - (strlen($adminPass) % 16);
  return $adminPass . str_repeat(chr($pad), $pad);
}
echo aes128WithFirst16Char('加密的密码','key值');
PHP 相关文章推荐
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
php stream_get_meta_data返回值
Sep 29 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
php之curl设置超时实例
Nov 03 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
php使用array_search函数实现数组查找的方法
Jun 12 PHP
php简单获取复选框值的方法
May 11 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
php二维数组按某个键值排序的实例讲解
Feb 15 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 #PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 #PHP
PHP实现一个限制实例化次数的类示例
Sep 16 #PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 #PHP
php项目中类的自动加载实例讲解
Sep 12 #PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 #PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 #PHP
You might like
php连接mssql数据库的几种方法
2013/02/21 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
python使用分治法实现求解最大值的方法
2015/05/12 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
Python 忽略warning的输出方法
2018/10/18 Python
python实现维吉尼亚算法
2019/03/20 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
保送生自荐信范文
2013/10/06 职场文书
结婚周年感言
2014/02/24 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
房屋所有权证明
2014/10/20 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
导游词欢迎词
2015/02/02 职场文书
奖励申请报告范文
2015/05/15 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
初任公务员培训心得体会
2016/01/08 职场文书