PHP AES加密

news/2024/11/27 6:27:31/

PHP使用AES方式进行加密、解密。

使用openssl_encrypt函数进行加密:

openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] ) : string

参数$method - 加密方法,可选值DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB

参数$options - 操作,可选值0、OPENSSL_RAW_DATA=1、OPENSSL_ZERO_PADDING=2、OPENSSL_NO_PADDING=3

OPENSSL_RAW_DATA方式,会用PKCS#7进行补位
OPENSSL_ZERO_PADDING方式,会用0进行补位
与前端交互只能使用OPENSSL_RAW_DATA和OPENSSL_ZERO_PADDING方式

参数$key和$iv只能是16位,超过16位PHP加密失败,非16位,前端解密失败。如果加密方法是DES-ECB,则iv必须为空。

很多加密方法加密的结果是乱码,所以需要对结果进行base64编码,前端拿到直接解密,不需要base64解码。

PHP加密解密代码:

<?phpclass Aes {protected $method = 'AES-128-CBC';protected $secret_key = 'Sd2@s.f9)_2o6dpu';protected $options = OPENSSL_RAW_DATA;public function encrypt($data) {$ivlen = openssl_cipher_iv_length($this->method);$iv = openssl_random_pseudo_bytes($ivlen);$iv = bin2hex($iv);if(strlen($iv) > $ivlen) {$iv = substr($iv, 0, $ivlen);}if(is_array($data)) {$data = json_encode($data);}$sign = openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $iv);$sign = base64_encode($sign);return array('sign' => $sign, 'iv' => $iv);}public function decrypt($sign, $iv) {return openssl_decrypt($sign, $this->method, $this->secret_key, $this->options, $iv);}}$aes = new Aes;
$content = array('name' => 'test', 'sex' => 'man');
$result = $aes->encrypt($content);
print_r($result);$data = $aes->decrypt(base64_decode($result['sign']), $result['iv']);
print_r($data);

打印出加密结果是:

Array
(
    [sign] => SeZA9+1qK1jsEiPlUC9Rlus8g91Kqm6V8aDV1au5y0Q=
    [iv] => 8c30406e5d51d4bc
)

前端解密需要用到CryptoJS,下载地址https://github.com/sytelus/CryptoJS

前端解密代码:

<!DOCTYPE html>
<html>
<head><title></title><script src="./CryptoJS-master/rollups/aes.js"></script><script src="./CryptoJS-master/components/mode-ecb.js"></script><script src="./CryptoJS-master/components/pad-nopadding.js"></script><script type="text/javascript">var sign = "SeZA9+1qK1jsEiPlUC9Rlus8g91Kqm6V8aDV1au5y0Q=";var iv = "8c30406e5d51d4bc";iv = CryptoJS.enc.Utf8.parse(iv);var key = "Sd2@s.f9)_2o6dpu";key = CryptoJS.enc.Utf8.parse(key);var decrypted = CryptoJS.AES.decrypt(sign, key, {iv: iv,mode: CryptoJS.mode.CBC,padding : CryptoJS.pad.Pkcs7});decrypted = decrypted.toString(CryptoJS.enc.Utf8);console.log('decrypted', decrypted);</script>
</head>
<body></body>
</html>

 


http://www.ppmy.cn/news/940395.html

相关文章

iOS AES加密

AES 美国国家安全局采用的加密方法&#xff0c;MAC 系统自带的钥匙串也是采用的AES 加密方法 有两种模式 CBC 模式 链式加密 &#xff0c;密码块链&#xff0c;使用一个秘钥和一个初始化向量&#xff0c;对数据执行加密。 ECB 电子密码本方法加密&#xff0c;数据拆分成块&a…

加密(AES)

什么是AES&#xff1f; 高级加密标准&#xff08;英语&#xff1a;Advanced Encryption Standard&#xff0c;缩写&#xff1a;AES&#xff09;&#xff0c;是一种区块加密标准。这个标准用来替代原先的DES&#xff0c;已经被多方分析且广为全世界所使用。 那么为什么原来的D…

AES加密相关

AES是一种对称加密算法&#xff0c;即用同一把密钥进行加密与解密。AES加密有以下几个参数需要注意&#xff1a; 1.key AES要求密钥具有16byte、24byte或者32byte&#xff0c;位数越高&#xff0c;加密强度越大&#xff0c;加密轮数依次为10、12、14轮。以128位密钥为例&#…

AES加密工具

1.对称加密 对称加密是最快速、最简单的一种加密方式&#xff0c;加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密通常使用的是相对较小的密钥&#xff0c;一般小于256 bit。因为密钥越大&#xff0c;加密越强&#xff0c;但加密与解密的过程越慢。…

RSA与AES加密

目录 一、非对称加密和RSA 1.非对称秘钥 2.RSA加密的核心 3.Python中实现RSA加密解密 二、HTTPS通信过程 三、对称加密和AES 1.AES简介 2.Python中实现AES加解密 一、非对称加密和RSA 1.非对称秘钥 https://blog.csdn.net/gao131360144/article/details/79966094HTTPS&…

AES加密的坑

其实不应该算AES加密的坑&#xff0c;而是加密后使用的坑 正常的加密应该是 $data openssl_encrypt($input, AES-256-CBC, $this->key, OPENSSL_RAW_DATA, $this->hex_iv); 返回给用户使用还要base64编码&#xff0c; base64_encode($data) 就是这个编码可能会造成解…

AES加密过程

AES是一个对称密码&#xff0c;旨在取代DES成为广泛使用的标准。 一、AES的加密过程 二、AES的数据结构 加密解密算法的输入是一个128位分组。这些分组被描述成44的字节方阵&#xff0c;这个分组被复制到state数组中&#xff0c;并在加密和解密的每一阶段都被修改。在字节方阵…

AES加密代码

这里分享AES的加密代码&#xff0c;包含两种填充方式PKCS7Padding和PKCS5Padding。代码中加密后的数据再加密成Base64形式&#xff0c;这一部分也可以换成16进制的形式。 Java本身是不支持PKCS7Padding加密、解密的&#xff0c;因此需要添加外部依赖。 <!-- https://mvnre…