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 相关文章推荐
python3.0 字典key排序
Dec 24 Python
Python实现抓取页面上链接的简单爬虫分享
Jan 21 Python
Python 异常处理的实例详解
Sep 11 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
Python类的继承和多态代码详解
Dec 27 Python
python实现图书管理系统
Mar 12 Python
浅述python中深浅拷贝原理
Sep 18 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
Python模块future用法原理详解
Jan 20 Python
Java ExcutorService优雅关闭方式解析
May 30 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
获得Google PR值的PHP代码
2007/01/28 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python实现公司年会抽奖程序
2019/01/22 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
Shell如何接收变量输入
2012/09/24 面试题
计算机专业推荐信范文
2013/11/27 职场文书
西门豹教学反思
2014/02/04 职场文书
主题团日活动总结
2014/06/25 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
亲属关系公证书样本
2015/01/23 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
基于python制作简易版学生信息管理系统
2021/04/20 Python
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
golang连接MySQl使用sqlx库
2022/04/14 Golang
全网非常详细的pytest配置文件
2022/07/15 Python