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开发的小球完全弹性碰撞游戏代码
Oct 15 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
django从请求到响应的过程深入讲解
Aug 01 Python
python递归实现快速排序
Aug 18 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
tensorflow模型继续训练 fineturn实例
Jan 21 Python
python文件及目录操作代码汇总
Jul 08 Python
Python解析微信dat文件的方法
Nov 30 Python
django中websocket的具体使用
Jan 22 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
python中如何设置代码自动提示
2020/07/15 Python
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
行政前台岗位职责
2013/12/04 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
外国人聘用意向书
2014/04/01 职场文书
活动宣传策划方案
2014/05/23 职场文书
学校与家长安全责任书
2014/07/23 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
督导岗位职责
2015/02/04 职场文书
数学教师个人工作总结
2015/02/06 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
mysql如何配置白名单访问
2021/06/30 MySQL
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL