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 爬虫爬取指定博客的所有文章
Feb 17 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
Python中join函数简单代码示例
Jan 09 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
python实现任意位置文件分割的实例
Dec 14 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
Python closure闭包解释及其注意点详解
Aug 28 Python
python操作cfg配置文件方式
Dec 22 Python
pycharm导入源码的具体步骤
Aug 04 Python
python 实时调取摄像头的示例代码
Nov 25 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 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 无限极分类
2008/03/27 PHP
PHP安全上传图片的方法
2015/03/21 PHP
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
js实现日历与定时器
2017/02/22 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
python判断windows隐藏文件的方法
2014/03/21 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
团委竞选演讲稿
2014/04/24 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
电子专业求职信
2014/06/19 职场文书
教师节班会开场白
2015/06/01 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js
Redis特殊数据类型bitmap位图
2022/06/01 Redis