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自动化开发学习之三级菜单制作
Jul 14 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
Django 连接sql server数据库的方法
Jun 30 Python
python实现五子棋人机对战游戏
Mar 25 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
利用python计算时间差(返回天数)
Sep 07 Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 Python
Python遍历字典方式就实例详解
Dec 28 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
Apr 01 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
python 写一个性能测试工具(一)
Oct 24 Python
Python语言内置数据类型
Feb 24 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
实用函数9
2007/11/08 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
prototype 的说明 js类
2006/09/07 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
python贪吃蛇游戏代码
2020/04/18 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
Pycharm调试程序技巧小结
2020/08/08 Python
python3实现简单飞机大战
2020/11/29 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
电气自动化大学生求职信
2013/10/16 职场文书
英语生日邀请函
2014/01/23 职场文书
校园文化建设方案
2014/02/03 职场文书
入党综合考察材料
2014/06/02 职场文书
2014年度安全工作总结
2014/12/04 职场文书