python实现的AES双向对称加密解密与用法分析


Posted in Python onMay 02, 2017

本文实例讲述了python实现的AES双向对称加密解密与用法。分享给大家供大家参考,具体如下:

高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES只是个基本算法,实现AES有若干模式。其中的CBC模式因为其安全性而被TLS(就是https的加密标准)和IPSec(win采用的)作为技术标准。简单地说,CBC使用密码和salt(起扰乱作用)按固定算法(md5)产生key和iv。然后用key和iv(初始向量,加密第一块明文)加密(明文)和解密(密文)。

下面介绍python实现的AES加密解密实例,这里采用CBC模式,用到了pycrypto‎模块

安装:

pip install Crypto
pip install binascii

实现:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#@author: rui.xu
#这里使用pycrypto‎库
#按照方法:easy_install pycrypto‎
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
class prpcrypt():
  def __init__(self,key):
    self.key = key
    self.mode = AES.MODE_CBC
  #加密函数,如果text不足16位就用空格补足为16位,
  #如果大于16当时不是16的倍数,那就补足为16的倍数。
  def encrypt(self,text):
    cryptor = AES.new(self.key,self.mode,b'0000000000000000')
    #这里密钥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)
    elif count > length:
      add = (length-(count % length))
      text = text + ('\0' * add)
    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,b'0000000000000000')
    plain_text = cryptor.decrypt(a2b_hex(text))
    return plain_text.rstrip('\0')
if __name__ == '__main__':
  pc = prpcrypt('keyskeyskeyskeys') #初始化密钥
  import sys
  e = pc.encrypt(sys.argv[1]) #加密
  d = pc.decrypt(e) #解密
  print "加密:",e
  print "解密:",d

ValueError: IV must be 16 bytes long            windows下默认会报这个错,

cryptor = AES.new(self.key,self.mode,b'0000000000000000')

  实例化后面加上后面那个就Ok了

Python 相关文章推荐
Python的内存泄漏及gc模块的使用分析
Jul 16 Python
详解Python中内置的NotImplemented类型的用法
Mar 31 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
Python3爬虫学习入门教程
Dec 11 Python
Python基于百度云文字识别API
Dec 13 Python
Python何时应该使用Lambda函数
Jul 02 Python
django 微信网页授权登陆的实现
Jul 30 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
python爬虫请求头设置代码
Jul 28 Python
python中安装模块包版本冲突问题的解决
May 02 #Python
Python 操作MySQL详解及实例
Apr 30 #Python
浅谈function(函数)中的动态参数
Apr 30 #Python
python脚本爬取字体文件的实现方法
Apr 29 #Python
Python在图片中添加文字的两种方法
Apr 29 #Python
Python实现对字符串的加密解密方法示例
Apr 29 #Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 #Python
You might like
php中static静态变量的使用方法详解
2010/06/04 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php操作MongoDB类实例
2015/06/17 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
php中__toString()方法用法示例
2016/12/07 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
详解基于webpack&amp;gettext的前端多语言方案
2019/01/29 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
Openlayers实现距离面积测量
2020/09/28 Javascript
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
Python调用.NET库的方法步骤
2019/12/27 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL