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中的装饰器详解
Apr 13 Python
Python使用django获取用户IP地址的方法
May 11 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
python 初始化一个定长的数组实例
Dec 02 Python
Python生成器常见问题及解决方案
Mar 21 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
Python3如何判断三角形的类型
Apr 12 Python
Python更换pip源方法过程解析
May 19 Python
Python如何将模块打包并发布
Aug 30 Python
用Python爬取某乎手机APP数据
Jun 15 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漏洞小结
2012/02/05 PHP
分享一段php获取linux服务器状态的代码
2014/05/27 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
采用call方式实现js继承
2014/05/20 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
工业设计专业推荐信
2013/10/29 职场文书
项目建议书格式
2014/03/12 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
Python预测分词的实现
2021/06/18 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记