如何基于python3和Vue实现AES数据加密


Posted in Python onMarch 27, 2020

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具有以下几个特点:

1、最常用的对称加密算法
2、密钥建立时间短、灵敏性好、内存需求低
3、实际使用中,使用工作模式为CTR(最好用BC去实现),此工作模式需要引入IV参数(16位的字节数组)
4、密钥长度128/192/256,其中192与256需要配置无政策限制权限文件(JDK6)
5、填充模式最常用的两种PKCS5Padding和PKCS7Padding,其中后者只有BC独有。
6、加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。

python (ECB)应用

安装:

Windows : pip install pycryptodome

Linux : pip install pycrypto

import base64
import json
import re

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad


class AesCrypt(object):
  """
  AES 加密组件
  """

  def __init__(self, user, is_json=True):

    # 这里的密钥长度必须是 16 24 32
    key = 'suiyi_' + user.get('Auth')
    self.is_json = is_json
    self.encode_ = 'utf-8'
    self.key = self.add_32(key)
    print(self.key)
    self.aes = AES.new(self.key, AES.MODE_ECB) # 创建一个aes对象

  def add_32(self, key):
    """
    key 补齐32位
    :param key:
    :return:
    """
    # 字符串 a 不要小于32位
    a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
    key += a
    key = key[0:32]
    return key.encode(self.encode_)

  def aes_encrypt(self, text):
    """
    加密 支持 json 需在实例中制动 is_json = True
    :param text:
    :return:
    """
    if self.is_json:
      text = json.dumps(text, ensure_ascii=False)
    text = pad(text.encode('utf-8'), AES.block_size, style='pkcs7')
    encrypt_text = self.aes.encrypt(text)
    return base64.encodebytes(encrypt_text).decode().strip()

  def aes_decrypt(self, text):
    """
    解密 支持 json 需在实例中制动 is_json = True
    :param text:
    :return:
    """
    text = base64.decodebytes(text.encode(self.encode_))
    decrypt_bytes = self.aes.decrypt(text)
    decrypt_text = re.compile('[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\n\r\t]').sub('', decrypt_bytes.decode(
      self.encode_))
    if self.is_json:
      decrypt_text = json.loads(decrypt_text)
    return decrypt_text
if __name__ == '__main__':
  user = {'Auth': '0000_zhangziyi'}
  pr = AesCrypt(user, is_json=True)
  data = {"unit": 1, "theme": "cur", "look_detail": True, "zero_empty": True, "zero_hide": True, "data_type": "sum"}
  en_text = pr.aes_encrypt(data)
  print('密文:', en_text)
  pr2 = AesCrypt(user, is_json=True)
  print('明文:', pr2.aes_decrypt(en_text))

Vue (ECB)应用

安装:

cnpm install crypto-js --save

import store from '@/store'
import CryptoJS from 'crypto-js/crypto-js'

function add_secret_key (userAuth) {
 let key = 'suiyi_' + userAuth
 if (key.length < 32) {
  let a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
  key += a.slice(0, 32 - key.length)
 } else if (key.length > 32) {
  key = key.slice(0, 32)
 }
 console.log(key)
 return key

}

/**
 * 加密
 * @param wordimport { aes_encrypt, aes_decrypt } from '../../libs/crypto'

aes_encrypt(this.data)
aes_decrypt(this.AES_data)
 * @param userAuth代码
 * @param is_json
 * @returns {string}
 */
export const aes_encrypt = (word, userAuth, is_json = true) => {
 if (is_json) {
  word = JSON.stringify(word)
 }
 var key = CryptoJS.enc.Utf8.parse(add_secret_key(userAuth)) // s/iqSaaE0F3tsLgMCkCZjvqptKKzqD9/pMUnMkCwNjg= Set
 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()
}
/**
 * 解密
 * @param word
 * @param userAuth
 * @param is_json
 * @returns {string}
 */
export const aes_decrypt = (word, userAuth, is_json = true) => {
 var key = CryptoJS.enc.Utf8.parse(add_secret_key(userAuth))// s/iqSaaE0F3tsLgMCkCZjvqptKKzqD9/pMUnMkCwNjg= Set
 var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
 let decrypt_text = CryptoJS.enc.Utf8.stringify(decrypt).toString()
 if (is_json) {
  decrypt_text = JSON.parse(decrypt_text)
 }
 return decrypt_text
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python动态加载变量示例分享
Feb 17 Python
Python生成随机MAC地址
Mar 10 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
Django中模型Model添加JSON类型字段的方法
Jun 17 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
Python列表删除的三种方法代码分享
Oct 31 Python
python代码过长的换行方法
Jul 19 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
浅谈Python 函数式编程
Jun 20 Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 #Python
Python实现的北京积分落户数据分析示例
Mar 27 #Python
Pyspark获取并处理RDD数据代码实例
Mar 27 #Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 #Python
Python爬虫爬取、解析数据操作示例
Mar 27 #Python
python opencv进行图像拼接
Mar 27 #Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 #Python
You might like
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
PHP中的命名空间详细介绍
2015/07/02 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
对Python _取log的几种方式小结
2019/07/25 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
信息服务专业毕业生求职信
2014/03/02 职场文书
大学生就业自荐书
2014/06/16 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
2014年教研员工作总结
2014/12/23 职场文书
教师个人师德总结
2015/02/06 职场文书
优秀团员个人总结
2015/02/26 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python