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 相关文章推荐
在Django框架中运行Python应用全攻略
Jul 17 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
Python通用循环的构造方法实例分析
Dec 19 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
Python3实现二叉树的最大深度
Sep 30 Python
flask框架url与重定向操作实例详解
Jan 25 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
Jan 10 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实现文件编码批量转换
2014/03/10 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
五好党支部事迹材料
2014/02/06 职场文书
后天观后感
2015/06/08 职场文书