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


Posted in Python onOctober 03, 2020

第一种

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'), AES.MODE_CBC, vi.encode('utf8'))
  encryptedbytes = cipher.encrypt(data.encode('utf8'))
  # 加密后得到的是bytes类型的数据
  encodestrs = base64.b64encode(encryptedbytes)
  # 使用Base64进行编码,返回byte字符串
  enctext = encodestrs.decode('utf8')
  # 对byte字符串按utf-8进行解码
  return enctext


def AES_Decrypt(key, data):
  vi = '0102030405060708'
  data = data.encode('utf8')
  encodebytes = base64.decodebytes(data)
  # 将加密数据转换位bytes类型数据
  cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
  text_decrypted = cipher.decrypt(encodebytes)
  unpad = lambda s: s[0:-s[-1]]
  text_decrypted = unpad(text_decrypted)
  # 去补位
  text_decrypted = text_decrypted.decode('utf8')
  return text_decrypted


key = '0CoJUm6Qyw8W8jud' #自己密钥
data = 'sdadsdsdsfd' #需要加密的内容
AES_Encrypt(key, data)
enctext = AES_Encrypt(key, data)
print(enctext)
text_decrypted = AES_Decrypt(key, enctext)
print(text_decrypted)

第二种

#!/usr/bin/env python
#encoding=‘utf-8'
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto import Random

class PrpCrypt(object):

  def __init__(self, key):
    self.key = key.encode('utf-8')
    self.mode = AES.MODE_CBC
    self.iv = Random.new().read(AES.block_size)

  # 加密函数,如果text不足16位就用空格补足为16位,
  # 如果大于16当时不是16的倍数,那就补足为16的倍数。
  def encrypt(self, text):
    text = text.encode('utf-8')

    cryptor = AES.new(self.key, self.mode,self.iv)
    # 这里密钥key 长度必须为16(AES-128),
    # 24(AES-192),或者32 (AES-256)Bytes 长度
    # 目前AES-128 足够目前使用
    length = 16
    count = len(text)
    if count < length:
      add = (length - count)
      # \0 backspace
      # text = text + ('\0' * add)
      text = text + ('\0' * add).encode('utf-8')
    elif count > length:
      add = (length - (count % length))
      # text = text + ('\0' * add)
      text = text + ('\0' * add).encode('utf-8')
    self.ciphertext = cryptor.encrypt(text)
    # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
    # 所以这里统一把加密后的字符串转化为16进制字符串
    return b2a_hex(self.ciphertext)

  # 解密后,去掉补足的空格用strip() 去掉
  def decrypt(self, text):
    cryptor = AES.new(self.key, self.mode, self.iv)
    plain_text = cryptor.decrypt(a2b_hex(text))
    # return plain_text.rstrip('\0')
    return bytes.decode(plain_text).rstrip('\0')


if __name__ == '__main__':
  pc = PrpCrypt('0CoJUm6Qyw8W8jud') # 初始化密钥
  data = input("请输入待加密数据:")#
  e = pc.encrypt(data) # 加密
  d = pc.decrypt(e).encode() # 解密
  print("加密:", e)
  print("解密:", d)

以上就是Python实现AES加密,解密的两种方法的详细内容,更多关于Python实现AES加密,解密的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python中查看变量内存地址的方法
May 05 Python
利用python将图片转换成excel文档格式
Dec 30 Python
python实现自动发送报警监控邮件
Jun 21 Python
10个Python小技巧你值得拥有
Sep 29 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
django 自定义过滤器的实现
Feb 26 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
cookies应对python反爬虫知识点详解
Nov 25 Python
python实现AdaBoost算法的示例
Oct 03 #Python
Django创建一个后台的基本步骤记录
Oct 02 #Python
Python中qutip用法示例详解
Oct 02 #Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 #Python
Python通过fnmatch模块实现文件名匹配
Sep 30 #Python
Python tempfile模块生成临时文件和临时目录
Sep 30 #Python
Python实现定时监测网站运行状态的示例代码
Sep 30 #Python
You might like
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
如何利用python查找电脑文件
2018/04/27 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
妈妈的账单教学反思
2014/02/06 职场文书
护士求职自荐信范文
2014/03/19 职场文书
国庆横幅标语
2014/10/08 职场文书
邹越演讲观后感
2015/06/15 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
你需要掌握的20个Python常用技巧
2022/02/28 Python
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL