<?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对称加密类的更多相关文章

  1. Java常用的加密解密类(对称加密类)

    Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...

  2. C#加密类

    var es= EncryptSugar.GetInstance(); string word = "abc"; var wordEncrypt = es.Encrypto(wor ...

  3. .net 对称加密DESCryptoServiceProvider

    1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...

  4. DotNet加密方式解析--对称加密

    离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性 ...

  5. AES对称加密解密类

    import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...

  6. Asp.Net 常用工具类之加密——对称加密DES算法(2)

    又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...

  7. C#不对称加密

    对称加密的缺点是双方使用相同的密钥和IV进行加密.解密.由于接收方必须知道密钥和IV才能解密数据,因此发送方需要先将密钥和IV传递给接收方.这就 有一个问题,如果攻击者截获了密钥和IV,也就等于知道了 ...

  8. 介绍对称加密的另一个算法——PBE

    除了DES,我们还知道有DESede(TripleDES,就是3DES).AES.Blowfish.RC2.RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法 ...

  9. 对称加密DES和TripleDES

    一.  对称加密 对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码).因此,通信双方都必 ...

随机推荐

  1. eclipse testng插件安装

    1.安装Testng 在Eclipse中,点击Help→Install new software→点击Add,在location中输入http://beust.com/eclipse ,选择TestN ...

  2. 2017-2018-2 20179204《网络攻防实践》linux基础

    我在实验楼中学习了Linux基础入门课程,这里做一个学习小结. 第一节 linux系统简介 本节主要介绍了linux是什么.发展历史.重要人物.linux与window的区别以及如何学习linux. ...

  3. 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

    传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5, ...

  4. Vbat 1.8V,接充電器,GPIO_CHG_EN pin 竟然是 high!

    Schematic : Precondition : Vbat 1.8V Plugin adapter Preloader doesn't enable GPIO_CHG_EN Origin : 做個 ...

  5. c#使用椭圆签名算法制作软件序列号

    椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC)是基于椭圆曲线数学的一种公钥密码的方法.椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Vict ...

  6. js-页面需展示大量图片时,采用lyz.delayLoading.min.js,图片在屏幕时加载显示

    本文本内容拷贝至:https://blog.csdn.net/xuanwuziyou/article/details/48199123 当一个网页中有大量图片时,浏览器会逐个去下载这些图片,等全部下载 ...

  7. java excel导出(基于注解)

    小白,做日志只是为了方便自己查看,能帮到别人当然更好,不喜勿喷. 上代码 依赖: <dependency> <groupId>org.apache.poi</groupI ...

  8. SQLServer 跟踪 扩展事件(Extended Events) 专家

    http://blog.csdn.net/kk185800961/article/details/49725903

  9. ios构造和析构

    遵循规则: 构造先父类后子类 析构先子类后父类 所以,自定义的init函数需要首先[super init....] dealloc中[super dealloc]却是放在最后的 - (id)initW ...

  10. 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”

    首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. 通常,在模块的头文件中对本模块提供给其它模块 ...