之前写过一篇:

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的加密解密的更多相关文章

  1. PHP AES的加密解密

    AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  2. PHP AES的加密解密-----【弃用】

    mcrypt_decrypt在PHP7.*已经被弃用,取而代之的是openssl_decrypt/encrypt,请参考: PHP7.* AES的加密解密 AES加密算法 密码学中的高级加密标准(Ad ...

  3. Golang之AES/DES加密解密

    AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...

  4. 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密解密源码

    一.AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes ...

  6. PHP 服务端 和 APP 客户端 实现 RSA+AES 双向加密解密

    目的:服务端和移动端双向加密解密 共有七个文件 其中包括三个类文件 lib_aes.php aes对称加密解密类 server_rsa_crypt.php 服务端RSA公钥私钥非对称加密解密类 cli ...

  7. AES对称加密解密类

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

  8. .NET/android/java/iOS AES通用加密解密(修正安卓)

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  9. JAVA和PYTHON同时实现AES的加密解密操作---且生成的BASE62编码一致

    终于有机会生产JAVA的东东了. 有点兴奋. 花了一天搞完.. java(关键key及算法有缩减): package com.security; import javax.crypto.Cipher; ...

随机推荐

  1. Linux进阶知识和命令

    一.Linux目录结构 目录 说明 /lost found系统修复 /bin 二进制命令所在的目录. /boot 系统引导程序所需的文件目录.安装系统分区的时候一般单独要分一个boot分区,大小可谓1 ...

  2. Zabbix 监控触发器设置

    简述 在生产环境中,有一台mysql的备份服务器,上面运行着三个数据库实例的从库,也在做日志的同步工作,为了实现对该备份服务器的监控,当出现从库实例不为3或者日志同步进程不为3的时候,产生告警通知,生 ...

  3. 多输入select

    目录 多输入select IO模型 select介绍 小demo 注意 引入电子书 title: 多输入select date: 2019/3/20 17:21:34 toc: true --- 多输 ...

  4. 编写高质量的Python代码系列(二)之函数

    Python中的函数具备多种特性,这可以简化编程工作.Python函数的某些性质与其他编程语言中的函数相似,但也有性质是Python独有的.本节将介绍如何用函数来表达亿图.提升可复用程度,并减少Bug ...

  5. Eclipse - 安装lombok后注解无效

    安装 lombok lombok 的安装过程挺简单的,网上已经有很多相关的博客,这里就不在多说了,可以参考这篇:eclipse集成lombok注解不起作用 但是我按照网上的方式安装之后,注解一直不起作 ...

  6. Spring Cloud微服务实战:手把手带你整合eureka&zuul&feign&hystrix

    转载自:https://www.jianshu.com/p/cab8f83b0f0e 代码实现:https://gitee.com/ccsoftlucifer/springCloud_Eureka_z ...

  7. 吐血记录微信小程序授权获取Unionid及linux下使用bouncycastle解密用户数据 遇到的坑

    背景 公司小程序上线了,发现系统无法拿到一些用户的UniondID.但是上线前的测试一切都是正常的. 坑1 经排查,发现一些用户通过下面的接口无法得到unionid https://api.weixi ...

  8. Future of Future

    innovation  革新 , <社会创新实验室 宣传片>的个人记录(有加戏便于我自己理解) 1. 清洁能源 => sustainable 家. 2. 老龄化  => 外出接 ...

  9. 小程序跳转 H5 时 cookie 值处理问题

    小程序使用 <web-view></web-view> 内嵌 H5,当跳转至 H5 后,校验用户的登录状态是最重要的. 在做手中的项目 b.xx.com 时,需要调用另一个域名 ...

  10. js中函数和方法的区别

    函数(function)是一段代码,需要通过名字来进行调用.它能将一些数据(函数的参数)传递进去进行处理,然后返回一些数据(函数的返回值),也可以不返回数据. 方法(method)是通过对象调用的ja ...