PHP对称加密类
<?php
/**
* Created by PhpStorm.
* User: zongbinghuang
* Date: 2017/7/31
* Time: 15:13
*/ namespace app\common; use Exception; class BizEncrypt
{
const IV_SIZE = 16;
const CIPHER = 'AES-256-CBC'; private $key;#length:32 public function __construct($key)
{
$key = (string)$key; if (static::supported($key, self::CIPHER)) {
$this->key = $key;
} else {
throw new Exception('The only supported ciphers are AES-256-CBC with the correct key lengths.');
}
} public function encrypt($value)
{
$iv = self::random_bytes(self::IV_SIZE); $value = openssl_encrypt(serialize($value), self::CIPHER, $this->key, 0, $iv); if ($value === false) {
throw new \Exception('Could not encrypt the data.');
} $iv = base64_encode($iv);
$mac = hash_hmac('sha256', $iv . $value, $this->key);
$json = json_encode(compact('iv', 'value', 'mac')); if (!is_string($json)) {
throw new Exception('Could not encrypt the data.');
} return base64_encode($json);
} public function decrypt($payload)
{
$payload = $this->getJsonPayload($payload); $iv = base64_decode($payload['iv']); $decrypted = openssl_decrypt($payload['value'], self::CIPHER, $this->key, 0, $iv); if ($decrypted === false) {
throw new Exception('Could not decrypt the data.');
} return unserialize($decrypted);
} private static function supported($key, $cipher)
{
$length = mb_strlen($key, '8bit'); return ($cipher === 'AES-256-CBC' && $length === 32);
} private function getJsonPayload($payload)
{
$payload = json_decode(base64_decode($payload), true); if (!$payload || $this->invalidPayload($payload)) {
throw new Exception('The payload is invalid.');
} return $payload;
} private function invalidPayload($data)
{
return !is_array($data) || !isset($data['iv']) || !isset($data['value']) || !isset($data['mac']);
} private static function random_bytes($bytes)
{
try {
$bytes = self::RandomCompareInteger($bytes);
} catch (Exception $ex) {
throw new Exception('random_bytes(): $bytes must be an integer');
} if ($bytes < 1) {
throw new Exception('Length must be greater than 0');
} $secure = true;
$buf = openssl_random_pseudo_bytes($bytes, $secure);
if ($buf !== false && $secure && mb_strlen($buf, '8bit') === $bytes) {
return $buf;
} throw new Exception('Could not gather sufficient random data');
} private static function RandomCompareInteger($number, $fail_open = false)
{
if (is_numeric($number)) {
$number += 0;
} if (is_float($number) && $number > ~PHP_INT_MAX && $number < PHP_INT_MAX) {
$number = (int)$number;
} if (is_int($number) || $fail_open) {
return $number;
} throw new Exception('Expected an integer.');
}
}
PHP对称加密类的更多相关文章
- Java常用的加密解密类(对称加密类)
Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...
- C#加密类
var es= EncryptSugar.GetInstance(); string word = "abc"; var wordEncrypt = es.Encrypto(wor ...
- .net 对称加密DESCryptoServiceProvider
1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...
- DotNet加密方式解析--对称加密
离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性 ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- Asp.Net 常用工具类之加密——对称加密DES算法(2)
又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...
- C#不对称加密
对称加密的缺点是双方使用相同的密钥和IV进行加密.解密.由于接收方必须知道密钥和IV才能解密数据,因此发送方需要先将密钥和IV传递给接收方.这就 有一个问题,如果攻击者截获了密钥和IV,也就等于知道了 ...
- 介绍对称加密的另一个算法——PBE
除了DES,我们还知道有DESede(TripleDES,就是3DES).AES.Blowfish.RC2.RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法 ...
- 对称加密DES和TripleDES
一. 对称加密 对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码).因此,通信双方都必 ...
随机推荐
- 关于pymongo的一些说明
问题 一: 在pymongo中使用find是得到1个游标对象的,如果你想实现MongoDB shell中find操作,例如: > db.test.find() { "_id" ...
- TroubleShoot: Excel Services Fix - "The workbook cannot be opened".
1. 问题描述: 在SharePoint 2013 文档库中打开Excel 文件提示"The workbook cannot be opened" 错误提示框,文档不能正常显示. ...
- 【MFC】Button控件和Picture Control的鼠标事件执行顺序
1.Button控件鼠标事件执行顺序 (1) WM_LBUTTONDOWN (2) WM_LBUTTONUP (3) OnBnClickedButton1(); 2.Picture Control的鼠 ...
- 标准C程序设计七---53
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- MAMP 10.10下启动报错解决方案
cd /Applications/MAMP/Library/binmv envvars _envvars
- 在AxureRP8中实现广告文字滚动效果
本文是实现动态文字在一个区域中滚动的效果,大概实现过程如下: 先准备一个区域,然后让文字在该区域内水平移动,本文是实现了从右到左的轮询的效果,其他雷同. 在Axure中,这种移动的过程需要动态移动,利 ...
- react-dnd 拖拽
介绍 React DnD 是一组 React 高阶组件,可以用来帮你构建复杂的拖拽接口,同时解耦你的组件.React DnD 非常适合像 Trello 和 Storify 这样的应用,在不同地方通过拖 ...
- js-页面需展示大量图片时,采用lyz.delayLoading.min.js,图片在屏幕时加载显示
本文本内容拷贝至:https://blog.csdn.net/xuanwuziyou/article/details/48199123 当一个网页中有大量图片时,浏览器会逐个去下载这些图片,等全部下载 ...
- 洛谷——P1825 [USACO11OPEN]玉米田迷宫Corn Maze
P1825 [USACO11OPEN]玉米田迷宫Corn Maze 题目描述 This past fall, Farmer John took the cows to visit a corn maz ...
- Xamarin.Forms支持的地图显示类型
Xamarin.Forms支持的地图显示类型 在Xamarin.Forms中,专门提供了一个Map视图,用来显示地图.根据用户的需求不同,该视图支持三种地图显示类型,用户可以通过Map视图提供的M ...