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高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
python文件名和文件路径操作实例
Sep 29 Python
pandas 数据实现行间计算的方法
Jun 08 Python
详解python持久化文件读写
Apr 06 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
python实现从wind导入数据
Dec 03 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 Python
django创建css文件夹的具体方法
Jul 31 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 Python
如何使用pdb进行Python调试
Jun 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
PHP 获取文件权限函数介绍
2013/07/11 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
自定义jQuery选项卡插件实例
2013/03/27 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
跟老齐学Python之复习if语句
2014/10/02 Python
python利用datetime模块计算时间差
2015/08/04 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
土木工程应届生求职信
2013/10/31 职场文书
个人委托书格式
2014/04/04 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS
Golang bufio详细讲解
2022/04/21 Golang
python神经网络ResNet50模型
2022/05/06 Python
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS