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读写ini文件示例(python读写文件)
Mar 25 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
如何利用Boost.Python实现Python C/C++混合编程详解
Nov 08 Python
python字符串中匹配数字的正则表达式
Jul 03 Python
python之拟合的实现
Jul 19 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
解决Django no such table: django_session的问题
Apr 07 Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 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函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
详解Python的Django框架中的templates设置
2015/05/11 Python
python集合用法实例分析
2015/05/30 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
Python列表如何更新值
2020/05/27 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
机械个人求职信范文
2014/01/24 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
商务考察邀请函模板
2015/02/02 职场文书
售票员岗位职责
2015/02/15 职场文书
Python图像处理之图像拼接
2021/04/28 Python
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android
SQL之各种join小结详细讲解
2021/08/04 MySQL