PHP7.* AES的加密解密
之前写过一篇:
PHP AES的加密解密-----【弃用】
使用的是php5.*之前的mcrypt_decrypt 函数,该函数已经在php7.1后弃用了,上马的是openssl的openssl_encrypt,openssl_decrypt。
上期回顾
在php7.* 环境执行之前代码:
- <?php
- define('SECRETKEY', '12f862d21d3ceafba1b88e5f22960d55');
- /**
- * 加密方法
- * @param string $str
- * @return string
- */
- function encrypt($str) {
- //AES, 128 ECB模式加密数据
- $str = addPKCS7Padding($str);
- $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND); # MCRYPT_RAND 随机, 固定为 16个0
- define('A', $iv);
- $encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, SECRETKEY, $str, MCRYPT_MODE_CBC, $iv);
- return base64_encode($encrypt_str);
- }
- /**
- * 解密方法
- * @param string $str
- * @return string
- */
- function decrypt($str) {
- //AES, 128 ECB模式加密数据
- $str = base64_decode($str);
- $encrypt_str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, SECRETKEY, $str, MCRYPT_MODE_CBC,A);
- $encrypt_str = stripPKSC7Padding($encrypt_str);
- return $encrypt_str;
- }
- /**
- * 填充算法
- * @param string $source
- * @return string
- */
- function addPKCS7Padding($source) {
- $source = trim($source);
- $block = mcrypt_get_block_size('rijndael-128', 'cbc');
- $pad = $block - (strlen($source) % $block);
- if ($pad <= $block) {
- $char = chr($pad);
- $source .= str_repeat($char, $pad);
- }
- return $source;
- }
- /**
- * 移去填充算法
- * @param string $source
- * @return string
- */
- function stripPKSC7Padding($source) {
- $char = substr($source, -);
- $num = ord($char);
- $source = substr($source, , -$num);
- return $source;
- }
- /**
- * 加密
- */
- $string =encrypt('Hello, world!');
- print_r($string);
- echo '<hr>';
- /**
- * 解密
- */
- $string=decrypt($string);
- print_r($string);
打印:
- Deprecated: Function mcrypt_get_block_size() is deprecated in /home/wwwroot/web/html/php/a.php on line
- Deprecated: Function mcrypt_get_iv_size() is deprecated in /home/wwwroot/web/html/php/a.php on line
- Deprecated: Function mcrypt_create_iv() is deprecated in /home/wwwroot/web/html/php/a.php on line
- Deprecated: Function mcrypt_encrypt() is deprecated in /home/wwwroot/web/html/php/a.php on line
- HUou9juETJVsWw8RxA8qkKH1+zf5zy283ApG6yzW/rU=
- Deprecated: Function mcrypt_decrypt() is deprecated in /home/wwwroot/web/html/php/a.php on line
- Hello, world!

看看php官网的解释:http://php.net/manual/zh/function.mcrypt-encrypt.php

那句话怎么说的“mcrypt_decrypt要靠php自我奋斗,但也要考虑历史的进程。”,时代不一样了openssl当道啦!
openssl的加密解密
之前我们用mcrypt_decrypt 实现的代码,现在openssl两行代码就能实现。
- /**
- * openssl 实现
- */
- define('KEY', '12f862d21dcfeafb57bckfrrt5yuiopf');
- $iv= md5(time(). uniqid(),true);
- $str="Hello, world!";
- # 加密 md5->true 为16位md5
- echo $strEncode= base64_encode(openssl_encrypt($str, 'AES-128-CBC',KEY, OPENSSL_RAW_DATA , $iv)); # AES-256-CBC
- /**
- * 解密
- */
- echo "<hr>";
- echo openssl_decrypt(base64_decode($strEncode), 'AES-128-CBC', KEY, OPENSSL_RAW_DATA, $iv);
打印结果:

注意!
上面代码有没有发现问题:
偏移向量iv的长度必须为16位,比如整个19位回报错:
- Warning: openssl_encrypt(): IV passed is 19 bytes long which is longer than the 16 expected by selected cipher,
method 长度的问题,密码学方式我们用的最多的有两种,AES-128-CBC 与 AES-256-CBC
上节我们讲过字符串的长度问题
- 1 bit 位 = 1 二进制数据
- 1 byte 字节 = 8 bit
- 1 字母 = 1 byte = 8 bit
- 128位/8=16字节=16字符
- 192位/8=24字节=24字符
- 256位/8=32字节=32字符
也就是说KEY 的长度是根据AES-128-CBC 与 AES-256-CBC 变换的。使用 AES-128-CBC 时,key的长度应该为16位,使用 AES-256-CBC时,key的长度应该为32位。
当然了,如果key长度大于限定方式,也无所谓,不是我说无所谓,是php在处理的时候只截取实际的长度。如果长度不够php也会使用‘x00’填补。
所以上面的代码key长度是错误的,因为用的是AES-128-CBC,所以key长度应该为16位。对! 我就是故意的。
PHP7.* AES的加密解密的更多相关文章
- PHP AES的加密解密
AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...
- PHP AES的加密解密-----【弃用】
mcrypt_decrypt在PHP7.*已经被弃用,取而代之的是openssl_decrypt/encrypt,请参考: PHP7.* AES的加密解密 AES加密算法 密码学中的高级加密标准(Ad ...
- Golang之AES/DES加密解密
AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...
- 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密解密源码
一.AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes ...
- PHP 服务端 和 APP 客户端 实现 RSA+AES 双向加密解密
目的:服务端和移动端双向加密解密 共有七个文件 其中包括三个类文件 lib_aes.php aes对称加密解密类 server_rsa_crypt.php 服务端RSA公钥私钥非对称加密解密类 cli ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- .NET/android/java/iOS AES通用加密解密(修正安卓)
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- JAVA和PYTHON同时实现AES的加密解密操作---且生成的BASE62编码一致
终于有机会生产JAVA的东东了. 有点兴奋. 花了一天搞完.. java(关键key及算法有缩减): package com.security; import javax.crypto.Cipher; ...
随机推荐
- Linux-网络管理
网络管理 一 基本网络配置 linux操作系统,以太网卡用“eth”表示网卡:序号从零开始eth0代表到系统能够识别的第一个网卡eth1....第2个网卡 查看网卡信息 查看网卡信息 查看当前系统所连 ...
- php操作excel表格的导入和导出
前言:对于excel大家肯定熟悉不过了的,那么我们在日常的业务中应该是有对这些文件的导入导出操作的 类的下载:composer require phpoffice/phpexcel,其中Classes ...
- 2018-2019-2 《Java程序设计》第7周学习总结
20175319 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 本周学习<Java程序设计>第8章: 1.String类: Java专门提供了用 ...
- vue+element-ui实现显示隐藏密码
<template> <el-form :model="cuser_info" label-width="115px" label-posit ...
- 【AGC 002F】Leftmost Ball
Description Snuke loves colorful balls. He has a total of N*K balls, K in each of his favorite N col ...
- java基于redis事务的秒杀实现
package com.vian.user.service; import org.junit.Test; import org.springframework.util.CollectionUtil ...
- maven相关配置
复习了下maven的常用配置及相关解释,直接看的前辈们的博客, maven核心,pom.xml详解(转)
- UE4代码片断备份
在Actor内创建一个StaticMesh #include "Components/StaticMeshComponent.h" #include "Engine/St ...
- jQuery手机触屏拖动滑块验证跳转插件
HTML: <!DOCTYPE html> <html lang="en"> <head> <title>jQuery手机触屏拖动滑 ...
- fatal error: Eigen3/Core: 没有那个文件或目录
解决方法: 在CMakeLists.txt文件里添加: include_directories("/usr/include/eigen3")