基础知识
# 在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加密的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]