Python3 与 VUE的 AES加密解密

目录

简介

VUE的AES加密

Python AES加密

注意


密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一 [1]  。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之名命之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhine doll"。)(摘取百度百科)

简介

AES拥有很多模式,而此次采用的CBC模式:用key和iv(初始向量,加密第一块明文), 再加上扰码(随机数)(由于楼主比较懒,这里只列CBC和ECB的例子)

VUE的AES加密

  •  在vue项目中index.html引入crypto
<script src="https://cdn.bootcss.com/crypto-js/3.1.9/crypto-js.min.js"></script>
  • 在webpack.base.conf.js修改
  externals:{
      'crypto':'Crypto',
  },
  • 在src目录下创建文件index.js
/**
 * 工具类
 */
export default {//加密
  set(word, keyStr){
    keyStr = keyStr ? keyStr : 'abcdefghijklmnop';
    var key  = CryptoJS.enc.Utf8.parse(keyStr);//Latin1 w8m31+Yy/Nw6thPsMpO5fg==
    var srcs = CryptoJS.enc.Utf8.parse(word);
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return encrypted.toString();
  },
  //解密
  get(word, keyStr){
    keyStr = keyStr ? keyStr : 'abcdefghijklmnop';
    var key  = CryptoJS.enc.Utf8.parse(keyStr);//Latin1 w8m31+Yy/Nw6thPsMpO5fg==
    var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
  }

}
  • 在需要使用的页面中导入
import Crypto from "@/index";

let str = Crypto.get("好好学习")
console.log("暗文:" + str)
let str1 = Crypto.set(str)
console.log("明文: " + str1)

Python AES加密

  • 下载依赖库pycryptodome,请手动输入下载,之前默认的库已经over了
pip install pycryptodome
  • 若仍导入失败,在site-packages目录下手动修改crypto文件名为Crypto,没错,没有看错,手动修改
from Crypto.Cipher import AES
import base64

from Crypto.Util.Padding import pad


class AesCrypt:
    def __init__(self, model, iv, encode_, key='abcdefghijklmnop'):
        self.encrypt_text = ''
        self.decrypt_text = ''
        self.encode_ = encode_
        self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
        self.key = self.add_16(key)
        if model == 'ECB':
            self.aes = AES.new(self.key, self.model)  # 创建一个aes对象
        elif model == 'CBC':
            self.aes = AES.new(self.key, self.model, iv)  # 创建一个aes对象

        # 这里的密钥长度必须是16、24或32,目前16位的就够用了

    def add_16(self, par):
        par = par.encode(self.encode_)
        while len(par) % 16 != 0:
            par += b'\x00'
        return par

    # 加密
    def aesencrypt(self, text):
        text = pad(text.encode('utf-8'), AES.block_size, style='pkcs7')
        self.encrypt_text = self.aes.encrypt(text)
        return base64.encodebytes(self.encrypt_text).decode().strip()

    # 解密
    def aesdecrypt(self, text):
        text = base64.decodebytes(text.encode(self.encode_))
        self.decrypt_text = self.aes.decrypt(text)
        return self.decrypt_text.decode(self.encode_).strip('\0').strip("\n")


if __name__ == '__main__':
    pr = AesCrypt('ECB', '', 'utf-8', 'abcdefghijklmnop')
    pr1 = AesCrypt("ECB", "", "utf-8")
    en_text = pr.aesencrypt('123456')
    print('密文:', en_text)
    print('明文:', pr1.aesdecrypt(en_text))

注意

要保证vue和python加密后的密文一只,必须保证加密模式,偏移量,秘钥等全部一致

### Vue 中实现 RSA 加密和解密的方法 #### 1. 环境准备依赖安装 为了在 Vue 项目中实现 RSA 的加密功能,可以借助 `jsencrypt` 库来完成。以下是具体的准备工作: - **安装依赖** 对于基于 Vue2 或 Vue3 的项目,可以通过以下命令安装所需的库: ```bash npm install jsencrypt --save ``` - **全局引入(可选)** 如果希望在整个应用中都可以方便地调用加密工具,则可以在项目的入口文件中进行配置。例如,在 Vue2 的 `main.js` 文件中: ```javascript import Vue from &#39;vue&#39;; import JSEncrypt from &#39;jsencrypt&#39;; Vue.prototype.$encrypt = new JSEncrypt(); ``` 对于 TypeScript 支持的 Vue3 项目,也可以按照类似的逻辑设置全局变量。 --- #### 2. 前端 RSA 加密实现 前端主要负责使用公钥对数据进行加密处理。以下是具体实现方式: ```javascript // 导入 JSEncrypt 类 import JSEncrypt from &#39;jsencrypt&#39;; function encryptData(publicKey, data) { const crypt = new JSEncrypt(); // 创建实例 crypt.setPublicKey(publicKey); // 设置公钥 return crypt.encrypt(data); // 执行加密并返回结果 } export default encryptData; ``` 上述函数接受两个参数:一个是后端提供的公钥字符串 `publicKey`,另一个是要加密的数据 `data`。最终会返回经过 Base64 编码的加密串[^2]。 需要注意的是,如果要加密的内容长度较长,可能需要分段加密以满足 RSA 的最大输入限制[^4]。 --- #### 3. 后端 Flask 实现 RSA 解密 后端部分通常由 Python 提供支持,这里以 Flask 框架为例展示如何对接收到的加密数据进行解密操作。 首先确保已安装必要的库: ```bash pip install pycryptodome ``` 接着编写如下代码片段用于解密: ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 import base64 def decrypt_data(private_key, encrypted_data): rsakey = RSA.importKey(private_key.encode()) # 导入私钥 cipher = PKCS1_v1_5.new(rsakey) # 初始化解密对象 decrypted_text = cipher.decrypt(base64.b64decode(encrypted_data), None).decode(&#39;utf-8&#39;) return decrypted_text ``` 此函数接收两个参数——私钥字符串 `private_key` 和来自前端的加密数据 `encrypted_data`,并通过指定算法完成解密过程[^1]。 --- #### 4. AES+RSA 混合加密方案简介 虽然单独使用 RSA 可以解决安全性需求,但由于其性能较低以及存在明文大小限制等问题,实际开发中更倾向于采用 AES-RSA 组合的方式。即先利用随机生成的对称秘钥对大数据量内容做快速加密,再把该临时秘钥本身交给 RSA 处理传输至服务端[^3]。 这种方式既兼顾效率又保障了通信链路中的隐私保护能力。 --- ### 注意事项 - 公钥/私钥应妥善保管,切勿暴露在外网环境中。 - 当涉及敏感信息时务必启用 HTTPS 协议防止中间人攻击。 - 若需兼容移动端设备或者老版本浏览器,请测试目标平台是否完全支持所选用的技术栈。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值