python 实现aes256加密


Posted in Python onNovember 27, 2020

基础知识

# 在Linux操作系统下,Python3的默认环境编码变为了utf-8编码,所以在编写代码的时候,字符串大部分都是以utf-8处理
UTF-8:
1byte = 8bit
1个英文字符 = 1byte
1个中文字符 = 3byte

128bit = 16byte = 16个英文字符
192bit = 24byte = 24个英文字符
256bit = 32byte = 32个英文字符

AES256概念

AES是一种对称加密算法,对称指加密和解密使用同一个密钥; 256指密钥的长度是256bit,即32个英文字符的长度;密钥的长度决定了AES加密的轮数

AES256加密参数

  • 密钥: 一个32byte的字符串, 常被叫为key
  • 明文: 待加密的字符串;字节长度(按byte计算)必须是16的整数倍,因此,明文加密之前需要被填充
  • 模式: 加密模式,常用的有ECB、CBC;具体含义见参考链接
  • iv 偏移量: CBC模式下需要是16byte字符串; ECB下不需要

参考代码

# -------------------------------
# -*- coding: utf-8 -*-
# @Author:jianghan
# @Time:2020/11/25 14:46
# @File: crypt.py
# Python版本:3.6.8
# -------------------------------


"""
1、 填充字符串和明文字符串最后一位不能相同
2、 字符串编码默认是utf-8, key和iv默认为英文字符;字符串不支持其他编码或key/iv不支持为中文字符
"""


from enum import Enum, unique
from Crypto.Cipher import AES


@unique
class Mode(Enum):
 CBC = AES.MODE_CBC
 ECB = AES.MODE_ECB


@unique
class Padding(Enum):
 """ 定义填充的字符串 """
 SPACE = ' ' # 空格


class AES256Crypto:
 def __init__(self, key, mode=Mode.ECB, padding=Padding.SPACE, iv=None):
 """
 :param key: 密钥, 32byte 长度字符串
 :param mode: 加密模式, 来源 class Mode
 :param iv: 16byte 长度字符串
 :param padding: 填充的字符串, 来源class Padding
 """
 self.padding = self.check_padding(padding)

 self.key = self.padding_key(key)
 self.iv = self.padding_iv(iv) if iv else None

 self.mode = self.check_mode(mode)

 def check_mode(self, mode):
 """ 核对 mode """
 if mode not in Mode.__members__.values():
  raise Exception(f'mode {mode} not allowed!')
 if mode == Mode.CBC and not self.iv:
  raise Exception(f'iv is required')
 return mode

 def check_padding(self, padding):
 """ 核对 padding """
 if padding not in Padding.__members__.values():
  raise Exception(f'mode {padding} not allowed!')
 return padding

 def padding_ret_byte(self, text, _len=16):
 """ 填充并转成 bytes """
 text = text.encode()
 remainder = len(text) % _len
 remainder = _len if remainder == 0 else remainder
 text += (_len - remainder) * self.padding.value.encode()
 return text

 def padding_iv(self, iv: str):
 """ 补全iv 并转成 bytes"""
 if len(iv.encode()) > 16:
  raise Exception(f'iv {iv} must <= 16bytes')
 return self.padding_ret_byte(iv)

 def padding_key(self, key: str):
 """ 补全key 并转成 bytes """
 if len(key.encode()) > 32:
  raise Exception(f'key {key} must <= 32bytes')
 return self.padding_ret_byte(key, _len=32)

 def encrypt(self, text, encode=None):
 """
 加密
 :param text: 待加密字符串
 :param encode: 传入base64里面的方法
 :return: 若encode=None则不进行base加密处理,返回bytes类型数据
 """
 text = self.padding_ret_byte(text)
 # 注意:加密中的和解密中的AES.new()不能使用同一个对象,所以在两处都使用了AES.new()
 text = AES.new(key=self.key, mode=self.mode.value, iv=self.iv).encrypt(text)
 if encode:
  return encode(text).decode()
 return text

 def decrypt(self, text, decode=None):
 """ 解密 """
 if decode:
  if type(text) == str:
  text = text.encode()
  text = decode(bytes(text))
 else:
  if type(text) != bytes:
  raise Exception(text)
 text = AES.new(key=self.key, mode=self.mode.value, iv=self.iv).decrypt(text)
 text = text.strip(self.padding.value.encode())
 return text.decode()

使用范例

import json

# 这是一段待加密的字符串
text = '{"upi": "1341343", "overdue": "2020-11-26 00:00:00"}'
key = 't6LtKa3tD5X6qaJ6qOrAW3XmobFrY6ob'
iv = 'NjtP47eSECuOm3s6'
aes = AES256Crypto(key, Mode.CBC, Padding.SPACE, iv)
text_1 = aes.encrypt(text) 
# b'\xe7\x1d\xeae\xff\xc7\xc2\xd7\x8c\xf6\xe7\x82u\x7f\x168\xbc\x90\xad\x1e\x85M\xcb\xb0\xb4Ho\x1b\xe4\xec\x9d\x1d\xf93\xeb\x9b\xe7\xa3\xdd$\x8cEa\xab\xf7K~\x91H\xc3]5\xc4\x1a\xd4w[\x83\xb2"FC\x9f\x9d'
text_2 = aes.decrypt(text_1) 
# '{"upi": "1341343", "overdue": "2020-11-26 00:00:00"}'

import base64
text_3 = aes.encrypt(text, encode=base64.b16encode) 
# 'E71DEA65FFC7C2D78CF6E782757F1638BC90AD1E854DCBB0B4486F1BE4EC9D1DF933EB9BE7A3DD248C4561ABF74B7E9148C35D35C41AD4775B83B22246439F9D'
text_4 = aes.decrypt(text_3, decode=base64.b16decode)
# '{"upi": "1341343", "overdue": "2020-11-26 00:00:00"}'

以上就是python 实现aes256加密的详细内容,更多关于python aes256加密的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
windows下添加Python环境变量的方法汇总
May 14 Python
python学习开发mock接口
Apr 28 Python
Python转换时间的图文方法
Jul 01 Python
python实现中文文本分句的例子
Jul 15 Python
pandas的排序和排名的具体使用
Jul 31 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
对象析构函数__del__在Python中何时使用
Mar 22 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 #Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 #Python
Python基于template实现字符串替换
Nov 27 #Python
使用Python画了一棵圣诞树的实例代码
Nov 27 #Python
python 用opencv实现霍夫线变换
Nov 27 #Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 #Python
五种Python转义表示法
Nov 27 #Python
You might like
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
Yii框架登录流程分析
2014/12/03 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
JS重学系列之聊聊new操作符
2019/03/04 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[08:42]DOTA2每周TOP10 精彩击杀集锦vol.2
2014/06/25 DOTA
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
python线程的几种创建方式详解
2019/08/29 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
平面设计的岗位职责
2013/11/08 职场文书
自我鉴定注意事项
2014/01/19 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
了解Redis常见应用场景
2021/06/23 Redis