php7加密模式AESAES-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
注:在搞这个⾼级加密的时候发现很多问题,⼀复制粘贴党浪费我这么多时间,多看⽂档
参考⼿册
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 enc - $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|O - $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完成。如果没-$IV和$password⼀样,是⼀个字节字符串。它的长度取决于使⽤的算法。产⽣IV美元的最好⽅法是:
再注⼀下 : 参数 options 打开源码这⾥定义了⼀下,所以直接填1即可
define('OPENSSL_RAW_DATA', 1);
define('OPENSSL_ZERO_PADDING', 2);
define('OPENSSL_DONT_ZERO_PAD_KEY', 4);
这下就很清楚了 ⾃⼰玩吧,需要帮我的联系我,
这⾥在讲解⼀下填充的问题:⽐如线上⽹站上做测试:
这⾥解释⼀下参数,如上图中的加密出来的参数
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
如果帮到⼤家请扫下⾯收款码,哈哈哈哈哈
<?php
class 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
*
php8兼容php7吗*/
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)
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","c
md":"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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
PHP7扩展开发之引入外部so库遇到的问题
« 上一篇
MAC下面源码编译安装PHP7.1
下一篇 »
发表评论