mingyunyuziyou

PHP7.1+ AES的加密解密

作者: 秒速五厘米     
 


<?php 



/**
* openssl 实现   AES-128-CBC
*/
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);





/**
* openssl 实现   AES-128-CBC
*/
define('KEY', '12f862d21dcfeafb57bckfrrt5yuiopf');
$str="Hello, world!";

echo $strEncode= base64_encode(openssl_encrypt($str, 'AES-128-ECB',KEY));   # AES-256-ECB

/**
* 解密
*/
echo "<hr>";
echo openssl_decrypt(base64_decode($strEncode), 'AES-128-ECB', KEY);



?>



注意!

 上面代码有没有发现问题:

偏移向量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

上节我们讲过字符串的长度问题

bit 位    = 1  二进制数据
byte 字节  = 8  bit
字母 = 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位。