基础知识

# 在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加密相关推荐

  1. python AES中EBC模式加密

    **from Crypto.Cipher import AES import base64 # 来自微信好友:一觉昏睡人 BLOCK_SIZE = 16 # Bytes pad = lambda s: ...

  2. Python - AES SHA1PRNG 加密解密总结

    Python - AES SHA1PRNG 加密解密总结 Max.Bai 2020-11 上篇文章是当时研究AES加密的时候的记录,来龙去脉可以取看这篇 python3 - AES 加密实现java中 ...

  3. python aes new_填充不正确。AES Python加密

    我正在尝试使用python构建一个简单的加密.在 这是加密:from Crypto.Cipher import AES from Crypto.Util.Padding import pad from ...

  4. python aes 加盐 加密解密

    python aes 加盐 加密解密 爬虫就是在学习的过程,前几天从某网站的js里学到的加密方式,通过下断点弄清加密原理后,用python复现一下,在这里和大家分享下 #--------引入模块--- ...

  5. 【JS 逆向百例】Ether Rock 空投接口 AES256 加密分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  6. python爬虫之常见的加密方式

    前言 数据加密与解密通常是为了保证数据在传输过程中的安全性,自古以来就一直存在,古代主要应用在战争领域,战争中会有很多情报信息要传递,这些重要的信息都会经过加密,在发送到对应的人手上. 现代 ,在网络 ...

  7. aes256加密java_使用Java和JCEKS进行AES-256加密

    aes256加密java 总览 由于最近爱德华·斯诺登 ( Edward Snowden)发布了文件,以及针对JC Penny , Sony和Target等在线商业商店的黑客攻击激增,安全性已成为近年 ...

  8. 使用Java和JCEKS进行AES-256加密

    总览 由于最近爱德华·斯诺登 ( Edward Snowden)发布了文件以及针对JC Penny , Sony和Target等在线商业商店的黑客入侵,安全性已成为近年来讨论的重要话题. 虽然本文不会 ...

  9. golang实现AES ECB模式的加密和解密

    最近有一个需求需要在golang中实现AES ECB模式的加密和解密,  看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式, ...

最新文章

  1. java io 文件复制_实例讲述Java IO文件复制
  2. python代码图片-python实现图片上添加图片
  3. 无重复字符的最长子串【哈希算法】-O(n)
  4. Math常用方法,String转float并且保留两位小数,除法
  5. python中交换a和b的值_交换A和B之间的元素以获得和相等
  6. 基本数据类型的分类 0125
  7. “人工智障”,我们还能忍你多久?
  8. 2016北理复试机试题
  9. 获得中文每个字的拼音首字母
  10. hibernate java.util.date 精度_hibernate中java.util.Date类型映射
  11. 简述hdfs工作原理_HDFS原理篇
  12. 链家全国房价数据分析 : 数据分析及可视化
  13. spss导入数据 error:对于当前服务器语言环境而言,文本过长
  14. QT下以ADO连接ORACLE数据库
  15. modelsim vopt
  16. HTML“计算机输出”标签 codekbdsampttvarpre
  17. 人工智能之集束搜索Beam Search Algorithm
  18. 【Python】windows下Eclipse中安装集成webpy框架
  19. 7-2 两个巨大素数(质数)的乘积 (10分)
  20. 如何用CMake编译从github上下载的源码

热门文章

  1. psping使用方法
  2. Cisco搭建邮件服务器实现邮件收发
  3. 【STM32】USART
  4. USART串口通信实验
  5. java中 什么是常量、变量以及数据类型、注释方法有哪些
  6. 2022全新Java学习路线图动力节点(一)Java学前准备工作
  7. 数据库大作业(图 书 馆 管 理 系 统)内容较完整,有相应代码但需要自己截图(我们用的软件是SQL Server 2014 Management Studio)
  8. 用开源做出来的必须开源吗_开源应该符合道德吗?
  9. python学多久可以考二级建造师吗_怎么样才能从零基础考到二级建造师?
  10. nn.Identity()