当前位置: 移动技术网 > IT编程>脚本编程>Python > python 实现aes256加密

python 实现aes256加密

2020年11月27日  | 移动技术网IT编程  | 我要评论
基础知识# 在linux操作系统下,python3的默认环境编码变为了utf-8编码,所以在编写代码的时候,字符串大部分都是以utf-8处理utf-8:1byte = 8bit1个英文字符 = 1by

基础知识

# 在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加密的资料请关注移动技术网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网