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实现socket端口重定向示例
Feb 10 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Flask框架Flask-Login用法分析
Jul 23 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
python3.6中anaconda安装sklearn踩坑实录
Jul 28 Python
Python如何定义有默认参数的函数
Aug 10 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 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
简单的页面缓冲技术
2006/10/09 PHP
关于PHP5 Session生命周期介绍
2010/03/02 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
JS一次前端面试经历记录
2020/03/19 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
Python自定义主从分布式架构实例分析
2016/09/19 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
迪奥官网:Dior.com
2018/12/04 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
行政文员岗位职责
2013/11/08 职场文书
个人公开承诺书
2014/03/28 职场文书
个人工作年终总结
2015/03/09 职场文书
推广普通话的宣传语
2015/07/13 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
防止web项目中的SQL注入
2021/12/06 MySQL