python aes new_python 实现aes256加密
基础知识
# 在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加密的资料请关注WEB开发者其它相关文章!
python aes new_python 实现aes256加密相关推荐
- python AES中EBC模式加密
**from Crypto.Cipher import AES import base64 # 来自微信好友:一觉昏睡人 BLOCK_SIZE = 16 # Bytes pad = lambda s: ...
- Python - AES SHA1PRNG 加密解密总结
Python - AES SHA1PRNG 加密解密总结 Max.Bai 2020-11 上篇文章是当时研究AES加密的时候的记录,来龙去脉可以取看这篇 python3 - AES 加密实现java中 ...
- python aes new_填充不正确。AES Python加密
我正在尝试使用python构建一个简单的加密.在 这是加密:from Crypto.Cipher import AES from Crypto.Util.Padding import pad from ...
- python aes 加盐 加密解密
python aes 加盐 加密解密 爬虫就是在学习的过程,前几天从某网站的js里学到的加密方式,通过下断点弄清加密原理后,用python复现一下,在这里和大家分享下 #--------引入模块--- ...
- 【JS 逆向百例】Ether Rock 空投接口 AES256 加密分析
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- python爬虫之常见的加密方式
前言 数据加密与解密通常是为了保证数据在传输过程中的安全性,自古以来就一直存在,古代主要应用在战争领域,战争中会有很多情报信息要传递,这些重要的信息都会经过加密,在发送到对应的人手上. 现代 ,在网络 ...
- aes256加密java_使用Java和JCEKS进行AES-256加密
aes256加密java 总览 由于最近爱德华·斯诺登 ( Edward Snowden)发布了文件,以及针对JC Penny , Sony和Target等在线商业商店的黑客攻击激增,安全性已成为近年 ...
- 使用Java和JCEKS进行AES-256加密
总览 由于最近爱德华·斯诺登 ( Edward Snowden)发布了文件以及针对JC Penny , Sony和Target等在线商业商店的黑客入侵,安全性已成为近年来讨论的重要话题. 虽然本文不会 ...
- golang实现AES ECB模式的加密和解密
最近有一个需求需要在golang中实现AES ECB模式的加密和解密, 看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式, ...
最新文章
- java io 文件复制_实例讲述Java IO文件复制
- python代码图片-python实现图片上添加图片
- 无重复字符的最长子串【哈希算法】-O(n)
- Math常用方法,String转float并且保留两位小数,除法
- python中交换a和b的值_交换A和B之间的元素以获得和相等
- 基本数据类型的分类 0125
- “人工智障”,我们还能忍你多久?
- 2016北理复试机试题
- 获得中文每个字的拼音首字母
- hibernate java.util.date 精度_hibernate中java.util.Date类型映射
- 简述hdfs工作原理_HDFS原理篇
- 链家全国房价数据分析 : 数据分析及可视化
- spss导入数据 error:对于当前服务器语言环境而言,文本过长
- QT下以ADO连接ORACLE数据库
- modelsim vopt
- HTML“计算机输出”标签 codekbdsampttvarpre
- 人工智能之集束搜索Beam Search Algorithm
- 【Python】windows下Eclipse中安装集成webpy框架
- 7-2 两个巨大素数(质数)的乘积 (10分)
- 如何用CMake编译从github上下载的源码
热门文章
- psping使用方法
- Cisco搭建邮件服务器实现邮件收发
- 【STM32】USART
- USART串口通信实验
- java中 什么是常量、变量以及数据类型、注释方法有哪些
- 2022全新Java学习路线图动力节点(一)Java学前准备工作
- 数据库大作业(图 书 馆 管 理 系 统)内容较完整,有相应代码但需要自己截图(我们用的软件是SQL Server 2014 Management Studio)
- 用开源做出来的必须开源吗_开源应该符合道德吗?
- python学多久可以考二级建造师吗_怎么样才能从零基础考到二级建造师?
- nn.Identity()