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列表去重的二种方法
Feb 14 Python
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
python base64 decode incorrect padding错误解决方法
Jan 08 Python
用django设置session过期时间的方法解析
Aug 05 Python
Python使用matplotlib 模块scatter方法画散点图示例
Sep 27 Python
python队列原理及实现方法示例
Nov 27 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
python如何进行矩阵运算
Jun 05 Python
python实现梯度下降算法的实例详解
Aug 17 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 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往windows中添加用户
2006/12/06 PHP
php汉字转拼音的示例
2014/02/27 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
javascript 节点排序 2
2011/01/31 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
一封普通求职者的求职信
2013/11/20 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
职业女性的职业规划
2014/03/04 职场文书
2014企业年终工作总结
2014/12/23 职场文书
党支部考察意见范文
2015/06/02 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
python中的3种定义类方法
2021/11/27 Python
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫
基于redis+lua进行限流的方法
2022/07/23 Redis