php7 加密模式AES AES-128-CBC 填充PKCS7Padding 加密hex 字符集utf8

2024-02-08 23:59

本文主要是介绍php7 加密模式AES AES-128-CBC 填充PKCS7Padding 加密hex 字符集utf8,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB

注:在搞这个高级加密的时候发现很多问题,一群复制粘贴党浪费我这么多时间,多看文档

参考手册 PHP: openssl_decrypt - Manual

Parameters may seem obvius to some but not for everyone so: - $data can be as the description says raw or base64. If no $option is set (this is, if value of 0 is passed in this parameter), data will be assumed to be base64 encoded. If parameter OPENSSL_RAW_DATA is set, it will be understood as row data. - $password (key) is a String of [pseudo] bytes as those generated by the function openssl_random_pseudo_bytes(). - $options as (as for 2016) two possible values OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING. Setting both can be done by OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING. If no OPENSSL_ZERO_PADDING is specify, default pading of PKCS#7 will be done as it's been observe by [openssl at mailismagic dot com]'s coment in openssl_encrypt() - $iv is as in the case of $password, a String of bytes. Its length depends on the algorithm used. May be the best way to generate an $iv is by: 我也看不懂翻译一下:有些人可能觉得参数很明显,但并非每个人都如此:-$data可以如描述中所说的raw或base64。如果没有设置$option(如果此参数中传递的值为0),则假定数据是base64编码的。如果设置参数openssl_raw_data,它将被理解为行数据。-$password(key)是由函数openssl_random_pseudo_bytes()生成的[pseudo]字节字符串。-$options as(截至2016年)两个可能的值openssl_raw_data和openssl_zero_padding。两种设置都可以通过openssl_raw_data_openssl_zero_padding完成。如果没有指定openssl_zero_padding,pkcs 7的默认padding将按照openssl_encrypt()中[openssl at mailismagic dot com]的coment所观察的方式进行。-$IV和$password一样,是一个字节字符串。它的长度取决于使用的算法。产生IV美元的最好方法是:

再注一下 : 参数 options 打开源码这里定义了一下,所以直接填1即可

define('OPENSSL_RAW_DATA', 1);
define('OPENSSL_ZERO_PADDING', 2);
define('OPENSSL_DONT_ZERO_PAD_KEY', 4);

这下就很清楚了 自己玩吧,需要帮我的联系我,

这里在讲解一下填充的问题:比如线上网站上做测试:http://tool.chacuo.net/cryptaes

这里解释一下参数,如上图中的加密出来的参数 

39a2706b82b2c13e8442305d6a926b9518ad9bb658b01a11b95ce18c6b085347

39 是一个字节 a2 是一个字节 

加解密已经封装了自动填充,不需要自己在去填充补位和解密时截取去处位置

这里我被坑了,我在给它加l一次hex加解密其实是在加密的将他认定为字符串(十进制)转十六进制,解密时用十六进制转为ASCII,是错误的.大家注意了

还一个标注一下:iv默认就是16位,相信大家会遇到如下报错,openssl_encrypt 加密会把iv默认截成16位,所有就是你的iv如果是17位.你的iv会在末尾减一位,好了废话有点多,相信能帮助到大家,

Warning: openssl_encrypt(): IV passed is 17 bytes long which is longer than the 16 expected by selected cipher, truncating in

如果帮到大家请扫下面微信收款码,哈哈哈哈哈!!!!!!!!!!!

<?phpclass AES
{/*** var string $method 加解密方法,可通过openssl_get_cipher_methods()获得*/protected $method;/*** var string $secret_key 加解密的密钥*/protected $secret_key;/*** var string $iv 加解密的向量,有些方法需要设置比如CBC*/protected $iv;/*** var string $options (不知道怎么解释,目前设置为0没什么问题)*/protected $options;/*** 构造函数** @param string $key 密钥* @param string $method 加密方式* @param string $iv iv向量* @param mixed $options 还不是很清楚**/public function __construct($key, $method = 'AES-128-CBC', $iv = '', $options = 0){// key是必须要设置的$this->secret_key = isset($key) ? $key : exit('key为必须项');$this->method = $method;$this->iv = $iv;$this->options = $options;}/*** 加密方法,对数据进行加密,返回加密后的数据** @param string $data 要加密的数据** @return string**/public function encrypt($data){$en = openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);//$en = $this->String2Hex($en);return $en;}/*** 解密方法,对数据进行解密,返回解密后的数据** @param string $data 要解密的数据** @return string**/public function decrypt($data){//$data = $this->Hex2String($data);$de = openssl_decrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);return $de;}public function String2Hex($string){$hex='';
//        for ($i=0; $i < strlen($string); $i++){
//            $hex .= dechex(ord($string[$i]));
//        }$hex = bin2hex($string);return $hex;}public function Hex2String($hex){$string='';for ($i=0; $i < strlen($hex)-1; $i+=2){$string .= chr(hexdec($hex[$i].$hex[$i+1]));}return $string;}
}$data = '{"messageid":15645624658187,"timestamp":1564562465,"deviceid":"AD13L1907310001","cmd":"CMD-01","desired":{"allget":1}}';
$key = 'FW2VN#N8DAL147L*';
//$aes = new Aes($key, 'AES-128-CBC', '2398DHY433UGFKL1',  1);
$aes = new Aes($key, 'AES-128-CBC', '2398DHY433UGFKL1',  1);
$encode = $aes->encrypt($data);
echo "#####encode#####" . $encode . PHP_EOL;
$decode = $aes->decrypt($encode);
echo "#####decode#####" . $decode . PHP_EOL;

这篇关于php7 加密模式AES AES-128-CBC 填充PKCS7Padding 加密hex 字符集utf8的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692591

相关文章

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一