如何基于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基础教程之循环介绍
Aug 29 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
使用Python进行防病毒免杀解析
Dec 13 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
python设置中文界面实例方法
Oct 27 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
基于Python实现流星雨效果的绘制
Mar 18 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
PHP6新特性分析
2016/03/03 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
python列表与元组详解实例
2013/11/01 Python
python脚本内运行linux命令的方法
2015/07/02 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
python 字符串和整数的转换方法
2018/06/25 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
Python新手学习函数默认参数设置
2020/06/03 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
ORACLE第二个十问
2013/12/14 面试题
政府个人对照检查材料思想汇报
2014/10/08 职场文书
中考学习决心书
2015/02/04 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL