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 相关文章推荐
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
python 删除非空文件夹的实例
Apr 26 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
python统计指定目录内文件的代码行数
Sep 19 Python
django orm模块中的 is_delete用法
May 20 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
Python实战之实现简易的学生选课系统
May 25 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捕获Fatal error错误的方法
2014/06/11 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
简单实现php上传文件功能
2017/09/21 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
javascript控制在光标位置插入文字适合表情的插入
2014/06/09 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
用Python实现随机森林算法的示例
2017/08/24 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
策划总监岗位职责
2014/02/16 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
教师个人学习总结
2015/02/11 职场文书
导游词之珠海轮廓
2019/10/25 职场文书