Python AES加密实例解析


Posted in Python onJanuary 18, 2018

本文主要是对aes加密技术做一个简要分析,然后使用Python实现,具体介绍如下。

AES,是美国联邦政府采用的一种加密技术,AES有几个模式,其中CBC模式是公认的安全性最好的模式,被TLS所采用。

加密与解密双方需确定好key,key的长度可以是16位,24位,32位中的一个,分别对应了不同的算法。

如果key的长度是是16位的,那么被加密的明文长度必须是16的整数倍,但实际使用中,这么巧的事情很难发生,因此就需要对明文进行填充,最常用的方式就是填充\0,等到解密的时候,再把解密出来的明文右侧的\0全部去掉。你也许会关心,如果我明文最右侧原本就是一堆的\0,那么这么搞,岂不是要出问题么,是滴,确实会出问题,但这样的明文用来做什么呢?你想多了,这样的明文你这辈子恐怕都不会遇到。

下面看一段python示例代码,演示如何使用AES加密技术进行加密和解密

#coding=utf-8 
''''' 
加密的一方和解密的一方必须提前确定好key值 
''' 
from Crypto.Cipher import AES 
from binascii import b2a_hex, a2b_hex 
 
class MyCrypto(): 
  def __init__(self, key): 
    self.key_len = len(key) 
    if not self.key_len == 16 and not self.key_len == 24 and not self.key_len == 32: 
      raise Exception("length of key is wrong") 
    self.key = key 
    self.mode = AES.MODE_CBC  #这种模式更加安全 
 
  def encrypt(self, text): 
    ''''' 
      被加密的明文长度必须是key长度的整数倍,如果不够,则用\0进行填充 
      转成16进制字符串,是因为避免不可见的ascii在显示的时候捣乱 
    ''' 
    cryptor = AES.new(self.key, self.mode, self.key) 
    count = len(text) 
    add = self.key_len - (count % self.key_len) 
    text = text + ('\0' * add) 
    self.ciphertext = cryptor.encrypt(text) 
    return b2a_hex(self.ciphertext) 
 
 
  def decrypt(self, text): 
    ''''' 
      解密后需注意,加密时有可能填充\0,因此要去掉右侧的\0 
    ''' 
    cryptor = AES.new(self.key, self.mode, self.key) 
    plain_text = cryptor.decrypt(a2b_hex(text)) 
    return plain_text.rstrip('\0') 
 
 
if __name__ == '__main__': 
  mc = MyCrypto("kwsy_zds20160822") 
  e = mc.encrypt("张东升") 
  d = mc.decrypt(e) 
  print e,d

总结

以上就是本文关于Python AES加密实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python3.2模拟实现webqq登录
Feb 15 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
Python实现按中文排序的方法示例
Apr 25 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
python实现桌面壁纸切换功能
Jan 21 Python
Python开发网站目录扫描器的实现
Feb 21 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
python输入错误后删除的方法
Oct 12 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
快速了解python leveldb
Jan 18 #Python
Python实现动态图解析、合成与倒放
Jan 18 #Python
Python基于matplotlib实现绘制三维图形功能示例
Jan 18 #Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 #Python
python中requests和https使用简单示例
Jan 18 #Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 #Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 #Python
You might like
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
php $_SERVER当前完整url的写法
2009/11/12 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
python打造爬虫代理池过程解析
2019/08/15 Python
如何运行带参数的python脚本
2019/11/15 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Python中logging日志库实例详解
2020/02/19 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
如何基于线程池提升request模块效率
2020/04/18 Python
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
Oracle锁表解决方法的详细记录
2022/06/05 Oracle