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使用KNN算法手写体识别
Feb 01 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
python使用mysql的两种使用方式
Mar 07 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
Pandas实现一列数据分隔为两列
May 18 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
详解Python多线程下的list
Jul 03 Python
python redis存入字典序列化存储教程
Jul 16 Python
python-地图可视化组件folium的操作
Dec 14 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 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
操作Oracle的php类
2006/10/09 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
Symfony核心类概述
2016/03/17 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
iscroll实现下拉刷新功能
2017/07/18 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
python 基于opencv实现图像增强
2020/12/23 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
中学生班主任评语
2014/01/30 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
文明家庭事迹材料
2014/12/20 职场文书
python数据处理之Pandas类型转换
2022/04/28 Python
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android