本文使用aes-128-ctr进行加密。
至于aes-192-ctr、aes-256-ctr无非秘钥、填充位的长度不一样。直接百度好了。
在PHP中aes-128-ctr 没有自动计算填充位,需要自己手动计算。当时被坑了好久.....
aes-128-cbc就无需自己计算填充位.
加密填充:
public function enPKSC7($text){
$block_size = 16; //128:16、256:32
$text_length = strlen($text);
//计算需要填充的位数
$amount_to_pad = $block_size - ($text_length % $block_size);
if ($amount_to_pad == 0) {
$amount_to_pad = $block_size;
}
//获得补位所用的字符
$pad_chr = chr($amount_to_pad);
$tmp = "";
for ($index = 0; $index < $amount_to_pad; $index++) {
$tmp .= $pad_chr;
}
return $text . $tmp;
}
解密填充:
public function dePKSC7($text){
$block_size = 16; //128:16、256:32
$pad = ord(substr($text, -1));
if ($pad < 1 || $pad > $block_size) {
$pad = 0;
}
return substr($text, 0, (strlen($text) - $pad));
}
加密:
public function enAES_CTR($data, $key, $iv)
{
$data = enPKSC7($data); //填充
$sign = openssl_encrypt($data, 'aes-128-ctr',$key, OPENSSL_RAW_DATA, $iv);
return bin2hex($sign);
}
解密:
public static function deAES_CTR($data, $key, $iv)
{
$sign = openssl_decrypt(hex2bin($data), 'aes-128-ctr',$key, OPENSSL_RAW_DATA, $iv);
return dePKSC7($sign); //去掉填充位
}
本文输入输出为16进制结果。openssl_encrypt 具体参考文档,本文重点介绍填充处理。