当前位置:首页 > 技术分享 > 正文内容

PHP AES加解密 (ECB模式/sha1prng算法/PKCS5Padding和PKCS7Padding补码) ECB 模式不需求设置 iv

admin1年前 (2021-03-20)技术分享781

php7+ 版本

/**
 * [AesSecurity aes加密,支持PHP7+]
 * 算法模式:ECB
 * 密钥长度:128
 * 补码方式:PKCS7Padding
 * 解密串编码方式:base64/十六进制
 */
class Aes
{
    /**
     * [encrypt aes加密]
     * @param    [type]                   $input [要加密的数据]
     * @param    [type]                   $key   [加密key]
     * @return   [type]                          [加密后的数据]
     */
    public static function encrypt($input, $key)
    {
        $key = self::_sha1prng($key);
        $iv = '';
        $data = openssl_encrypt($input, 'AES-128-ECB', $key, OPENSSL_RAW_DATA, $iv);
        $data = base64_encode($data);
        return $data;
    }

    /**
     * [decrypt aes解密]
     * @param    [type]                   $sStr [要解密的数据]
     * @param    [type]                   $sKey [加密key]
     * @return   [type]                         [解密后的数据]
     */
    public static function decrypt($sStr, $sKey)
    {
        $sKey = self::_sha1prng($sKey);
        $iv = '';
        $decrypted = openssl_decrypt(base64_decode($sStr), 'AES-128-ECB', $sKey, OPENSSL_RAW_DATA, $iv);
        return $decrypted;
    }

    /**
     * SHA1PRNG算法
     * @param  [type] $key [description]
     * @return [type]      [description]
     */
    private static function _sha1prng($key)
    {
        return substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);
    }
}

php5+ 版本

/**
 * [Aes aes加密,支持PHP5+]
 * 算法模式:ECB
 * 密钥长度:128
 * 补码方式:PKCS5Padding/PKCS7Padding
 * 解密串编码方式:base64/十六进制
 */
class Aes {

    public static function encrypt($plain, $key)
    {
        if (trim($key) == '') {
            return false;
        }
        $plain       = strval($plain);
        $block_size  = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $padded_data = self::_pkcs5_pad($plain, $block_size);
        $iv_size     = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $iv          = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $encrypted   = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, self::_sha1prng($key), $padded_data, MCRYPT_MODE_ECB, $iv);
        return base64_encode($encrypted);
    }

    public static function decrypt($cipher, $key)
    {
        if ( ! is_string($cipher) || trim($key) == '') {
            return false;
        }

        if ($decoded = base64_decode($cipher)) {
            $block_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
            $iv         = mcrypt_create_iv($block_size, MCRYPT_RAND);
            $decrypted  = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, self::_sha1prng($key), $decoded, MCRYPT_MODE_ECB, $iv);
            return self::_pkcs5_unpad($decrypted);
        }
        return false;
    }

    
    private static function _sha1prng($key)
    {
        return substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);
    }

    private static function _pkcs5_pad($text, $block_size)
    {
        $pad = $block_size - (strlen($text) % $block_size);
        return $text . str_repeat(chr($pad), $pad);
    }

    private static function _pkcs5_unpad($text)
    {
        $end  = substr($text, -1);
        $last = ord($end);
        $len  = strlen($text) - $last;
        if (substr($text, $len) == str_repeat($end, $last)) {
            return substr($text, 0, $len);
        }
        return false;
    }

    private static function _pkcs7_pad($string, $blocksize = 32)
    {
        $len = strlen($string);
        $pad = $blocksize - ($len % $blocksize);
        $string .= str_repeat(chr($pad), $pad);
        return $string;
    }
 
    private static function _pkcs7_unpad($string)
    {
        $pad = ord ($string {strlen($string) - 1});
        if ($pad > strlen($string)) {
            return false;
        }
        if (strspn ($string, chr ($pad), strlen($string) - $pad) != $pad) {
            return false;
        }
        return substr($string, 0, - 1 * $pad);
    }

}

使用方法:

//使用方法:
$keyStr = 'EF1712FC070C2C21';
$aes = new Aes();
$str = 'hello word';
$chgstr = $aes->encrypt($str,$keyStr);
echo $chgstr;
echo "<br/>";
$rstr = $aes->decrypt($chgstr,$keyStr);
echo $rstr;

代码中的相关算法

  • 算法模式:ECB

  • 密钥长度:128

  • 补码方式:PKCS5Padding

  • 解密串编码方式:base64/十六进制

  • ECB 模式不需求设置 iv

扫描二维码推送至手机访问。

版权声明:本文由小刚刚技术博客发布,如需转载请注明出处。

本文链接:http://blog.bitefu.net/post/142.html

分享给朋友:

相关文章

节假日api 负载均衡升级 增加阿里云服务器

以下是服务器的情况可根据自己的需求进行选择1.tool.bitefu.net 整合服务器到 新的阿里云服务器(配置更高),旧服务器已不再续费2.vip.bitefu.net增加一个阿里云虚拟主机 现在已经有三条dns负载均衡的解析...

实现服务器的代码与Gitee的代码同步更新:通过宝塔的WebHook、Git、Gitee的WebHooks

实现服务器的代码与Gitee的代码同步更新:通过宝塔的WebHook、Git、Gitee的WebHooks

(超详细避坑)实现服务器的代码与Gitee的代码同步更新:通过宝塔的WebHook、Git、Gitee的WebHooks前言一、效果展示二、实现步骤2.1 使用宝塔git生成公钥2.2 创建Gitee仓库,添加公钥2.3 宝塔安装WebHo...

php高效检测远程图片是否存在

php高效检测远程图片是否存在function img_exits($url){     $ch = curl_init();    &...

WPS表格办公—取消科学计数法显示

WPS表格办公—取消科学计数法显示

我们在利用WPS表格与Excel表格进行日常办公时,经常需要制作各种各样的表格,当我们在表格当中输入长数据的时候,表格经常会自动显示为科学计数法,很多人都看不懂科学计数法的意思,那么,我们如何在输入长数字的时候避免显示为科学计数法呢,今天我...

【不忘初心】19041/19042/19043(20H1,20H2,21H1)告别繁琐 一键替换太阳谷图标 一键恢复原版图标 一键恢复文件夹预览

【不忘初心】19041/19042/19043(20H1,20H2,21H1)告别繁琐 一键替换太阳谷图标 一键恢复原版图标 一键恢复文件夹预览

一键替换太阳谷图标,一键恢复原版图标,注意是一键!!!  太阳谷图标确实很好看,很新颖 !论坛也有相关替换教程,有的需要改权限,有的需要PE下替换,有的还得重启,搞不好很容易翻车,有些小白同学只能望梅止渴,今天以上统统告...

用apicloud 免费,简单封装一个wap手机网站成android app

用apicloud 免费,简单封装一个wap手机网站成android app

APICloud是国内较早布局低代码开发的平台之一,其发布的低代码效率工具Plus Mode,为IT项目中每个角色提供专业工具,将需求分析、产品原型、UI设计、前端开发、后端开发紧密衔接,并基于行业大数据对前置环节进行复用,最终缩减大量重复...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。