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使用xauth方式登录饭否网然后发消息
Apr 11 Python
Python性能优化的20条建议
Oct 25 Python
python Django框架实现自定义表单提交
Mar 25 Python
如何利用Fabric自动化你的任务
Oct 20 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
Django自定义manage命令实例代码
Feb 11 Python
python3解析库pyquery的深入讲解
Jun 26 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
django form和field具体方法和属性说明
Jul 09 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 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中与数组相关的函数
2007/03/22 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
[原创]图片分页查看
2006/08/28 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
在Django的session中使用User对象的方法
2015/07/23 Python
Python语言快速上手学习方法
2018/12/14 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
python读取Kafka实例
2019/12/23 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
四风存在的原因分析
2014/02/11 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
代办出身证明书
2014/10/21 职场文书
简易离婚协议书范本
2014/10/24 职场文书
2015年双拥工作总结
2015/04/08 职场文书
2015年科普工作总结
2015/07/23 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS