PHP、Python、JavaScript实现AES加密解密
发布日期:2021-07-01 06:08:38
浏览次数:2
分类:技术文章
本文共 4573 字,大约阅读时间需要 15 分钟。
先说需求:
需要后端和前端通信需要将数据加密后传输前端 <-> 加密数据 <-> 后端
总的来说PHP的使用时最简单的,坑最少,当之无愧世界上最好的语言
以下是代码实现
以下代码实现统一使用参数AES加密算法32位秘钥key (通过给定秘钥取md5值获得) 12345616位初始向量iv 秘钥key的md5值前16位加密数据 "123456789"
1、PHP实现AES加密解密
使用函数 openssl_encrypt
和 openssl_decrypt
key = $key; $this->method = $method; $this->iv = $iv; } // 加密数据 public function encrypt($plain_text) { return openssl_encrypt($plain_text, $this->method, $this->key, 0, $this->iv); } // 解密数据 public function decrypt($cipher_text) { return openssl_decrypt($cipher_text, $this->method, $this->key, 0, $this->iv); }}/** * 以下是测试代码 */// ECB 模式function test_ecb($key, $data){ $aes = new AESCipher("AES-256-ECB", $key); $cipher_text = $aes->encrypt($data); echo $cipher_text . PHP_EOL; // 7J0VfbEYF0XdLnLuA1b4Fw== $plain_text = $aes->decrypt($cipher_text); echo $plain_text . PHP_EOL; // 123456789}// CBC 模式function test_cbc($key, $data, $iv){ $aes = new AESCipher("AES-256-CBC", $key, $iv); $cipher_text = $aes->encrypt($data); echo $cipher_text . PHP_EOL; // sfH6iGxc01TkIaOUN77hQQ== $plain_text = $aes->decrypt($cipher_text); echo $plain_text . PHP_EOL; // 123456789}$key = "123456";$md5_key = md5($key);$iv = substr($md5_key, 0, 16);$data = "123456789";test_ecb($md5_key, $data);test_cbc($md5_key, $data, $iv);
参考
2、Python3实现AES加密解密
安装模块
pip3 install md5utilpip3 install pycryptodome
import base64from Crypto.Cipher import AESfrom Crypto.Util.Padding import pad, unpadfrom md5util import md5class AESCipher(object): def __init__(self, key, mode, **kwargs): """ :param key: 16 (AES-128) 24 (AES-192) 32 (AES-256) :param mode: 模式 :param kwargs: iv 初始向量 MODE_CBC 模式使用 必须是16字节 """ self.key = key self.mode = mode self.kwargs = kwargs def _get_aes(self): """TypeError: decrypt() cannot be called after encrypt()""" return AES.new(self.key.encode('utf-8'), self.mode, **self.kwargs) def encrypt(self, plain_text): # 选择pkcs7补全 pad_pkcs7 = pad(plain_text.encode('utf-8'), AES.block_size) encrypt_data = self._get_aes().encrypt(pad_pkcs7) return str(base64.b64encode(encrypt_data), encoding='utf-8') def decrypt(self, cipher_text): padded_data = self._get_aes().decrypt(base64.b64decode(cipher_text.encode('utf-8'))) return str(unpad(padded_data, AES.block_size), encoding='utf-8')def main(): key = "123456" md5_key = md5(key) aes_str = "123456789" # ECB 模式 ecb_cipher = AESCipher(md5_key, mode=AES.MODE_ECB) cipher_text = ecb_cipher.encrypt(aes_str) print(cipher_text) # 7J0VfbEYF0XdLnLuA1b4Fw== print(ecb_cipher.decrypt(cipher_text)) # CBC 模式 cbc_cipher = AESCipher(md5_key, mode=AES.MODE_CBC, IV=md5_key[0:16].encode()) cipher_text = cbc_cipher.encrypt(aes_str) print(cipher_text) # sfH6iGxc01TkIaOUN77hQQ== print(cbc_cipher.decrypt(cipher_text))if __name__ == '__main__': main()
参考
3、JavaScript实现AES加密解密
安装
npm install crypto-js
crypto-js使用的时候有点坑,不像别的语言实现,它会将你传入的key转为它需要的对象,所以要先调用下parse
函数
var CryptoJS = require("crypto-js");// 辅助函数function md5(data) { return CryptoJS.MD5(data).toString();}// 传入key之前要调用,不然结果不对function parseKey(key) { return CryptoJS.enc.Utf8.parse(key);}// 加密过程function encrypt(mode, plainText, key, iv = null) { const uKey = parseKey(key); const uIv = parseKey(iv); return CryptoJS.AES.encrypt(plainText, uKey, { iv: uIv, mode: mode, padding: CryptoJS.pad.Pkcs7 } ).toString();}// 解密过程function decrypt(mode, cipherText, key, iv = null) { const uKey = parseKey(key); const uIv = parseKey(iv); let bytes = CryptoJS.AES.decrypt(cipherText, uKey, { iv: uIv, mode: mode, padding: CryptoJS.pad.Pkcs7 } ); return bytes.toString(CryptoJS.enc.Utf8);}function test() { const key = '123456'; const md5Key = md5(key); const iv = md5Key.substr(0, 16); const data = '123456789'; // ECB 模式 let cipherText = encrypt(CryptoJS.mode.ECB, data, md5Key); console.log(cipherText); // 7J0VfbEYF0XdLnLuA1b4Fw== let plainText = decrypt(CryptoJS.mode.ECB, cipherText, md5Key); console.log(plainText); // CBC 模式 cipherText = encrypt(CryptoJS.mode.CBC, data, md5Key, iv); console.log(cipherText); // sfH6iGxc01TkIaOUN77hQQ== plainText = decrypt(CryptoJS.mode.CBC, cipherText, md5Key, iv); console.log(plainText);}test();
参考
转载地址:https://pengshiyu.blog.csdn.net/article/details/103646639 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月18日 06时01分32秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
button 标签
2019-05-04
VSCode-linux-x64 无法正常安装组件
2019-05-04
Eclipse 使用
2019-05-04
Win10 快捷键
2019-05-04
Chrome 快捷键
2019-05-04
Sublime Text 快捷键
2019-05-04
Spring BeanFactory、Bean和Context
2019-05-04
Vue 解决跨域问题
2019-05-04
C++的文件操作
2019-05-04
c++ unique()去重
2019-05-04
TCP/IP系列——长连接与短连接的区别
2019-05-04
UnityAPI——Mathf数学运算
2019-05-04
读『开发App常见的九大错误』
2019-05-04
Manifest merger ignores tools:replace when both android:name and tools:ignore are present on applic
2019-05-04
处理 InputMethodManager 内存泄露的正确姿势
2019-05-04
Dump Fragment
2019-05-04
Freeline - Android平台上的秒级编译方案
2019-05-04
美股课堂:美国银行开户亲历记
2019-05-05