php利用mcrypt.so扩展,如何加密解密AES-CBC模式数据?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
苏南大叔继续填坑,本文要填的坑就是:php
如何利用mcrypt.so
扩展加密数据,加密算法采用的是最常见的AES-CBC
模式。在以前的文章中,苏南大叔描述了如何利用mcrypt.so
解密数据了。那么,本文中,苏南大叔更加侧重于mcrypt.so
加密数据。当然,也会有对应的解密算法描述。
本文测试环境:mac
/php72
/mcrypt.so
。由于众所周知的原因,本文中大量使用了@
符号来抑制错误输出,见谅。
加密数据
下面的代码是使用AES-CBC
模式,加密数据的例子:
public function AesEncrypt($plaintext,$key,$iv)
{
$plaintext = trim($plaintext);
if ($plaintext == '') return '';
$size = @mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$padding = $size - strlen($plaintext) % $size;
$plaintext .= str_repeat(chr($padding), $padding);
$module = @mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key=substr($key, 0, @mcrypt_enc_get_key_size($module));
@mcrypt_generic_init($module, $key, $iv);
$encrypted = @mcrypt_generic($module, $plaintext);
@mcrypt_generic_deinit($module);
@mcrypt_module_close($module);
return base64_encode($encrypted);
}
解密数据
下面的代码是使用AES-CBC
模式,解密数据的例子:
public function AesDecrypt($encrypted, $key,$iv)
{
if ($encrypted == '') return '';
$ciphertext_dec = base64_decode($encrypted);
$module = @mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key= substr($key, 0, @mcrypt_enc_get_key_size($module));
@mcrypt_generic_init($module, $key, $iv);
$decrypted = @mdecrypt_generic($module, $ciphertext_dec);
@mcrypt_generic_deinit($module);
@mcrypt_module_close($module);
return rtrim($decrypted,"\0");
}
更多解密算法描述:
包装调用范例
下面的php
代码,是个aes
类:
class Aes
{
public function AesEncrypt($plaintext,$key,$iv)
{
$plaintext = trim($plaintext);
if ($plaintext == '') return '';
$size = @mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$padding = $size - strlen($plaintext) % $size;
$plaintext .= str_repeat(chr($padding), $padding);
$module = @mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key=substr($key, 0, @mcrypt_enc_get_key_size($module));
@mcrypt_generic_init($module, $key, $iv);
$encrypted = @mcrypt_generic($module, $plaintext);
@mcrypt_generic_deinit($module);
@mcrypt_module_close($module);
return base64_encode($encrypted);
}
public function AesDecrypt($encrypted, $key,$iv)
{
if ($encrypted == '') return '';
$ciphertext_dec = base64_decode($encrypted);
$module = @mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key= substr($key, 0, @mcrypt_enc_get_key_size($module));
@mcrypt_generic_init($module, $key, $iv);
$decrypted = @mdecrypt_generic($module, $ciphertext_dec);
@mcrypt_generic_deinit($module);
@mcrypt_module_close($module);
return rtrim($decrypted,"\0");
}
}
测试代码范例
下面的相关测试范例:
$a = new Aes();
$r=$a->AesEncrypt("我是苏南","bbb","a");
$r2=$a->AesDecrypt($r,"bbb","a");
echo $r; //APRxxqCBBEkfLhKyVIH4eQ==
echo $r2; //我是苏南
$iv = "sunandebokeyuming";
$key = "newsn.net";
$str = "CS+GUTtR9BU+dJypghhSvw==";
$r3=$a->AesDecrypt($str,$key,$iv);
echo $r3; //苏南大叔
相关文章
总结
填坑心很累,自己挖的坑,含泪也要填完。更多aes
加密解密的文字,请阅读苏南大叔的博客文章:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。