苏南大叔继续填坑,本文要填的坑就是:php如何利用mcrypt.so扩展加密数据,加密算法采用的是最常见的AES-CBC模式。在以前的文章中,苏南大叔描述了如何利用mcrypt.so解密数据了。那么,本文中,苏南大叔更加侧重于mcrypt.so加密数据。当然,也会有对应的解密算法描述。

苏南大叔:php利用mcrypt.so扩展,如何加密解密AES-CBC模式数据? - php-aes-mcrypt
php利用mcrypt.so扩展,如何加密解密AES-CBC模式数据?(图2-1)

本文测试环境: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");
    }
}

苏南大叔:php利用mcrypt.so扩展,如何加密解密AES-CBC模式数据? - php-aes-code
php利用mcrypt.so扩展,如何加密解密AES-CBC模式数据?(图2-2)

测试代码范例

下面的相关测试范例:

$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加密解密的文字,请阅读苏南大叔的博客文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接作者。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

 【加群】加入QQ群【175454274】和大家一起讨论这个问题

 【源码】本文代码片段及相关软件,请点此获取

 【绝密】秘籍文章入口,仅传授于有缘之人   php    aes

本站的忠实读者小伙伴,正在阅读下面这些文章: