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加密的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python实现AES加密,解密的两种方法

    第一种 import base64 from Crypto.Cipher import AES # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = '0102030405060708' pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16) data = pad(data) # 字符串补位 cipher = AES.new(key.encode('utf8

  • Python实现aes加密解密多种方法解析

    引子: 在windows中python3使用 pycryptodemo 模块实现Aes加密解密.Aes加密有多种方式,自己可以上网了解下. AES是每16位一加密,并且保证key和vi都是16位的.废话不多说直接上代码. import base64 from Crypto.Cipher import AES from binascii import b2a_hex,a2b_hex class PrpCrypt(object): def __init__(self,key,iv): self.ke

  • python简单实现AES加密和解密

    本文实例为大家分享了python实现AES加密和解密的具体代码,供大家参考,具体内容如下 参考:python实现AES加密和解密 AES加密算法是一种对称加密算法, 他有一个密匙, 即用来加密, 也用来解密 import base64 from Crypto.Cipher import AES # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = '0102030405060708' pad = lambda s: s + (

  • Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现.部分常用的加密方法基本都有对应的Python库,基本不再需要我们用代码实现具体算法. MD5加密 全称:MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致.md5加密算法是不可逆的,所以解密一般都是通过暴力穷举方法,通过网站的接口实现解密.Python代码: i

  • python实现AES加密和解密

    一.前言 AES,高级加密标准(英语:Advanced Encryption Standard).是用来替代DES,目前比较流行的加密算法. 它是一种对称加密算法,与上一篇博文提到过的RSA非对称算法不同,AES只有一个密钥,这个密钥既用来加密,也用于解密. AES只是个基本算法,实现AES有几种模式,主要有ECB.CBC.CFB和OFB这几种(其实还有个CTR): 1.ECB模式(电子密码本模式:Electronic codebook) ECB是最简单的块密码加密模式,加密前根据加密块大小(如

  • python encrypt 实现AES加密的实例详解

    AES加密方式有五种 : ECB, CBC, CTR, CFB, OFB 从安全性角度推荐cbc算法 windows 下安装 : pip install pycryptodome linux 下安装 : pip install pycrypto cbc加密需要一个十六位的key 和一个十六位的iv(偏移量) ecb加密不需要iv aes cbc 加密的python实现 from Crypto.Cipher import AES from binascii import b2a_hex, a2b_

  • Python3对称加密算法AES、DES3实例详解

    本文实例讲述了Python3对称加密算法AES.DES3.分享给大家供大家参考,具体如下: python3.6此库安装方式,需要pip3 install pycryptodome. 如有site-packages中存在crypto.pycrypto,在pip之前,需要pip3 uninstall crypto.pip3 uninstall pycrypto,否则无法安装成功. C:\WINDOWS\system32>pip3 install pycryptodome Collecting pyc

  • python实现AES加密与解密

    AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AES时要安装的是pycryptodome 模块 pip install pycryptodome python 在 Linux下使用AES时要安装的是pycrypto模块 pip install pycrypto CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量) ECB加密不需要iv

  • python实现AES加密解密

    本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原先的输入,运行的结果如下 开始的字符串就是输入的明文,第一个矩阵,是明文对应的状态矩阵,下面的字典是得到的经过扩展后的密钥,再下面的矩阵是经过加密之后的矩阵,最后的矩阵就是解密之后的矩阵,最后的输出就是还原的明文,可以发现AES加密解密的过程没毛病. (3)字节代换:输入输出都是十六进制的矩阵格式,

  • Python 的AES加密与解密实现

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.---百度百科 AES加密方式有五种

  • 如何基于python3和Vue实现AES数据加密

    高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对称加密算法也就是加密和解密用相同的密钥,具有以下几个特点: 1.最常用的对称加密算法 2.密钥建立时间短.灵敏性好.内存需求低 3.实际使用中,使用工作模式为CTR(最好用BC去实现),此工作模式需要引入IV参数(16位的字节数组) 4.密钥长度128/192/256,其中192与256需要配置无政策限制权限文件(JDK6) 5.填充模式最常用的两种

  • Python常用base64 md5 aes des crc32加密解密方法汇总

    1.base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形式,2.x可以是字符串形式. base64模块的base64编码.解码调用了binascii模块,binascii模块中的b2a_base64()函数用于base64编码,binascii模块中的a2b_base64()函数用于base64解码. >>>import base64 >&

  • Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签

    Python3.7 基于 pycryptodome 的AES加密解密.RSA加密解密.加签验签,具体代码如下所示: #!/usr/bin/env python # -*- coding: utf8 -*- import os import rsa import json import hashlib import base64 from Crypto.Cipher import AES from ..settings_manager import settings class RSAEncryp

随机推荐