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中用于计算对数的log()方法
May 15 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
Tensorflow卷积神经网络实例
May 24 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
python自定义时钟类、定时任务类
Feb 22 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
python set集合使用方法解析
Nov 05 Python
Python assert关键字原理及实例解析
Dec 13 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 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
php中的实现trim函数代码
2007/03/19 PHP
PHP 基本语法格式
2009/12/15 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
js查错流程归纳
2012/05/04 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
详解Python中time()方法的使用的教程
2015/05/22 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
python list多级排序知识点总结
2019/10/23 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
PyQt 如何创建自定义QWidget
2021/03/24 Python
三八节主持词
2014/03/17 职场文书
员工生日会策划方案
2014/06/14 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
聘任合同书
2015/09/21 职场文书