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写的服务监控程序实例
Jan 31 Python
在Django的session中使用User对象的方法
Jul 23 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
python执行精确的小数计算方法
Jan 21 Python
numpy基础教程之np.linalg
Feb 12 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
Python用5行代码实现批量抠图的示例代码
Apr 14 Python
Python实现仿射密码的思路详解
Apr 23 Python
python 使用三引号时容易犯的小错误
Oct 21 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
在线增减.htpasswd内的用户
2006/10/09 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
基于header的一些常用指令详解
2013/06/06 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
CCPry JS类库 代码
2009/10/30 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
Vue异步加载about组件
2017/10/31 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
python批量修改文件名的实现代码
2014/09/01 Python
Python简单进程锁代码实例
2015/04/27 Python
numpy基础教程之np.linalg
2019/02/12 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
会计的岗位职责
2014/03/15 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
平面设计专业求职信
2014/08/09 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
SSM VUE Axios详解
2021/10/05 Vue.js