Python常用base64 md5 aes des crc32加密解密方法汇总


Posted in Python onNovember 06, 2020

1.base64

Python内置的base64模块可以实现base64、base32、base16、base85、urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形式,2.x可以是字符串形式。

base64模块的base64编码、解码调用了binascii模块,binascii模块中的b2a_base64()函数用于base64编码,binascii模块中的a2b_base64()函数用于base64解码。

>>>import base64
>>> s = 'hello,word!'
>>> base64.b64encode(bytes(s,'ascii'))  #base64编码,编码的字符串必须是二进制形式的
b'aGVsbG8sd29yZCE='

>>> base64.b64decode(b'aGVsbG8sd29yZCE=')  #base64解码
b'hello,word!'

2.md5

Python2.x中有md5模块,此模块调用了hashlib模块,python3.x已中将md5取掉,直接通过调用hashlib模块来进行md5。Python2.x可以直接使用unicode字符,但3.x中必须使用二进制字节串。

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b'hello,word!')
>>> m.hexdigest()
'9702d6722a0901398efd4ecb3a20423f'

注意:每调用一次update(s),相当于给md5对象m增加了s。对一个新的需md5加密的内容,需要新建一个md5对象。

Hashlib模块还可以进行sha1、sha224、sha256、sha384、sha512等hash算法。Sha384、sha512在32位的平台上处理较慢。

3.crc32

计算指定内容的crc32校验值,可以用zlib以及binascii模块的crc32函数.

>>> import zlib
>>> import binascii
s = b'hello,word!'
>>> zlib.crc32(s)
3035098857

>>> binascii.crc32(s)
3035098857

4.crypt

crypt 模块(只用于 Unix/Linux,windows平台上没有此模块)实现了单向的 DES 加密, Unix/Linx系统使用这个加密算法来储存密码,这个模块真正也就只在检查这样的密码时有用。

>>> import crypt
>>> import random
>>> import string
>>> chars = string.digits + string.letters
>>> chars
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> def getsalt(chars):
...   return random.choice(chars) + random.choice(chars)
...
>>> salt = getsalt(chars)
>>> salt
'sb'
>>> msg = crypt.crypt('hello,world!',salt)
>>> msg
'sb0xvR6UbZsqw'

5.利用pycrypto包进行AES、DES、MD5等加密

第三方Crypto包提供了较全面的加密算法,包括Cipher、Hash、Protocol、PublicKey、Singature、Util几个子模块,其中Cipher模块中有常用的AES、DES加密算法,Hash模块中有MD5、MD4、SHA等算法。下面介绍AES及DES的加密解密算法,python版本为2.7.9。

5.1 AES加密解密

# coding=utf-8

from Crypto.Cipher import AES
from Crypto import Random
import binascii

key = '1234567890!@#$%^'  #秘钥,必须是16、24或32字节长度
iv = Random.new().read(16) #随机向量,必须是16字节长度

cipher1 = AES.new(key,AES.MODE_CFB,iv) #密文生成器,MODE_CFB为加密模式

encrypt_msg = iv + cipher1.encrypt('我是明文') #附加上iv值是为了在解密时找到在加密时用到的随机iv
print '加密后的值为:',binascii.b2a_hex(encrypt_msg)  #将二进制密文转换为16机制显示


cipher2 = AES.new(key,AES.MODE_CFB,iv) #解密时必须重新创建新的密文生成器
decrypt_msg = cipher2.decrypt(encrypt_msg[16:]) #后十六位是真正的密文
print '解密后的值为:',decrypt_msg.decode('utf-8')

运行后的结果为:

 >>> ================================ RESTART ================================
 >>> 
加密后的值为: 502d279e1cba9ef6744ad4ce5a12dbf9389c99731bfab1349e35b528
 解密后的值为: 我是明文

5.2 DES3加密解密

# coding=utf-8

from Crypto.Cipher import DES3
from Crypto import Random
import binascii

key = '1234567890!@#$%^'
iv = Random.new().read(8) #iv值必须是8位
cipher1 = DES3.new(key,DES3.MODE_OFB,iv) #密文生成器,采用MODE_OFB加密模式
encrypt_msg = iv + cipher1.encrypt('我是明文必须是八')
#附加上iv值是为了在解密时找到在加密时用到的随机iv,加密的密文必须是八字节的整数倍,最后部分
#不足八字节的,需要补位
print '加密后的值为:',binascii.b2a_hex(encrypt_msg)  #将二进制密文转换为16进制显示
cipher2 = DES3.new(key,DES3.MODE_OFB,iv) #解密时必须重新创建新的密文生成器
decrypt_msg = cipher2.decrypt(encrypt_msg[8:]) #后八位是真正的密文
print '解密后的值为:',decrypt_msg

运行后的结果为:

 >>> ================================ RESTART ================================
 >>> 
加密后的值为: 8caf464c66ec652e5305d33ff4814a3a4f8423b404ae6a48f4a1c411ecddf932
 解密后的值为: 我是明文必须是八

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
Python中如何获取类属性的列表
Dec 26 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
用python实现k近邻算法的示例代码
Sep 06 Python
python实现五子棋小游戏
Mar 25 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
Python定义函数实现累计求和操作
May 03 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
Python序列化与反序列化相关知识总结
Jun 08 Python
基于Python模拟浏览器发送http请求
Nov 06 #Python
python如何写个俄罗斯方块
Nov 06 #Python
基于Python实现全自动下载抖音视频
Nov 06 #Python
Python3读写ini配置文件的示例
Nov 06 #Python
Python Serial串口基本操作(收发数据)
Nov 06 #Python
python基于exchange函数发送邮件过程详解
Nov 06 #Python
Python Unittest原理及基本使用方法
Nov 06 #Python
You might like
PHP令牌 Token改进版
2008/07/18 PHP
完美解决PHP中文乱码
2009/11/26 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
js word表格动态添加代码
2010/06/07 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
Python-嵌套列表list的全面解析
2016/06/08 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
P/Invoke是什么
2015/07/31 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
法学院方阵解说词
2014/01/29 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
爽歪歪广告词
2014/03/20 职场文书
食品安全工作方案
2014/05/07 职场文书
教师个人自我评价
2015/03/04 职场文书
小王子读书笔记
2015/06/29 职场文书
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS