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自定义函数的创建、调用和函数的参数详解
Mar 11 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
Python实现将xml导入至excel
Nov 20 Python
Python实现全角半角字符互转的方法
Nov 28 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Python 如何安装Selenium
May 06 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
smarty实例教程
2006/11/19 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
2014/11/22 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
Express使用html模板的详细代码
2017/09/18 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
js实现简单点赞操作
2020/03/17 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Django框架 信号调度原理解析
2019/09/04 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
小学生打架检讨书
2014/01/26 职场文书
幼儿园教师培训方案
2014/02/04 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
服务员岗位职责范本
2015/04/09 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang
一文搞懂Redis中String数据类型
2022/04/03 Redis
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python