c语言sscanf函数的用法是什么
304
2022-09-13
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
注:在搞这个高级加密的时候发现很多问题,一群复制粘贴党浪费我这么多时间,多看文档
参考手册 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);
这下就很清楚了 自己玩吧,需要帮我的联系我,
这里在讲解一下填充的问题:比如线上网站上做测试:是一个字节 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
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;
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~