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中的Matplotlib模块入门教程
Apr 15 Python
使用Python对Csv文件操作实例代码
May 12 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
Sublime开发python程序的示例代码
Jan 24 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
python调用staf自动化框架的方法
Dec 26 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
Python中的__init__作用是什么
Jun 09 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数据库连接
2006/10/09 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
vue中appear的用法
2017/08/17 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
python3判断url链接是否为404的方法
2018/08/10 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
python实现井字棋小游戏
2020/03/04 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
英国电子专家:maplin
2019/09/04 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
小学数学教学经验交流材料
2014/05/22 职场文书
2015年少先队活动总结
2015/03/25 职场文书
呐喊读书笔记
2015/06/30 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript