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 解析html之BeautifulSoup
Jul 07 Python
Django框架实现逆向解析url的方法
Jul 04 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
举例讲解Python常用模块
Mar 08 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
pytorch 实现在预训练模型的 input上增减通道
Jan 06 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 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 array_multisort() 函数的深入解析
2013/06/20 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
python 判断是否为正小数和正整数的实例
2017/07/23 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
python学生信息管理系统(完整版)
2020/04/05 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
python中怎么表示空值
2020/06/19 Python
opencv 阈值分割的具体使用
2020/07/08 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
Foreo国际站:Foreo International
2018/10/29 全球购物
外包公司软件测试工程师
2014/11/01 面试题
英语演讲稿范文
2014/01/03 职场文书
大学生就业意向书范文
2014/04/01 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
销售口号大全
2014/06/11 职场文书