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 struct模块解析
Jun 12 Python
使用Python中的线程进行网络编程的入门教程
Apr 15 Python
Python递归遍历列表及输出的实现方法
May 19 Python
Python selenium文件上传方法汇总
Nov 19 Python
python使用openpyxl库修改excel表格数据方法
May 03 Python
Python3处理HTTP请求的实例
May 10 Python
python实战教程之自动扫雷
Jul 13 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
Python实用库 PrettyTable 学习笔记
Aug 06 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
python深copy和浅copy区别对比解析
Dec 26 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 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 全局变量范围分析
2009/08/07 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
通过隐藏option实现select的联动效果
2009/11/10 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
对python自动生成接口测试的示例讲解
2018/11/30 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python中正则表达式的用法总结
2019/02/22 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
python基于openpyxl生成excel文件
2020/12/23 Python
高中生校园生活自我评价
2013/09/19 职场文书
《胡杨》教学反思
2014/02/16 职场文书
实习生评语
2014/04/26 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技