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 tempfile模块学习笔记(临时文件)
May 25 Python
利用Python中的mock库对Python代码进行模拟测试
Apr 16 Python
Python实现股市信息下载的方法
Jun 15 Python
python+matplotlib绘制饼图散点图实例代码
Jan 20 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
用python实现一个简单的验证码
Dec 09 Python
python中pickle模块浅析
Dec 29 Python
pandas按条件筛选数据的实现
Feb 20 Python
浅谈python数据类型及其操作
May 25 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学习之数据类型之间的转换介绍
2011/06/09 PHP
php生成扇形比例图实例
2013/11/06 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
详解vue-router基本使用
2017/04/18 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
python 将字符串转换成字典dict
2013/03/24 Python
Python实现获取网站PR及百度权重
2015/01/21 Python
Python实现的RSS阅读器实例
2015/07/25 Python
Python中static相关知识小结
2018/01/02 Python
python实现猜数字小游戏
2020/03/24 Python
Python处理session的方法整理
2019/08/29 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
详解matplotlib绘图样式(style)初探
2021/02/03 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
2014年教师节寄语
2014/08/11 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Redis三种集群模式详解
2021/10/05 Redis
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python