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 相关文章推荐
python3编码问题汇总
Sep 06 Python
Python变量和数据类型详解
Feb 15 Python
Python递归函数定义与用法示例
Jun 02 Python
Python面向对象编程基础解析(一)
Oct 26 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
Python3 中文文件读写方法
Jan 23 Python
python网络爬虫学习笔记(1)
Apr 09 Python
在Python中使用gRPC的方法示例
Aug 08 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 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获取当月最后一天函数分享
2015/02/02 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
PHP实现简单日历类编写
2020/08/28 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
js模糊查询实例分享
2016/12/26 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
Python 中的with关键字使用详解
2016/09/11 Python
python中int与str互转方法
2018/07/02 Python
浅谈django orm 优化
2018/08/18 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
保安部任务及岗位职责
2014/02/25 职场文书
勾股定理课后反思
2014/04/26 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
教师素质教育心得体会
2016/01/19 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
Java 定时任务技术趋势简介
2022/05/04 Java/Android
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技