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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
简单介绍Python中用于求最小值的min()方法
May 15 Python
Python入门之三角函数tan()函数实例详解
Nov 08 Python
python数字图像处理之骨架提取与分水岭算法
Apr 27 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
Python异常处理操作实例详解
Aug 28 Python
python3下pygame如何实现显示中文
Jan 11 Python
python dumps和loads区别详解
Feb 04 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 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读注册表
2006/10/09 PHP
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
php实现读取手机客户端浏览器的类
2015/01/09 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
vue如何截取字符串
2019/05/06 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
python 中的int()函数怎么用
2017/10/17 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
python之mock模块基本使用方法详解
2019/06/27 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
全球最大的游戏市场:G2A
2018/07/05 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
2015年青年志愿者协会工作总结
2015/04/27 职场文书
2016寒假假期总结
2015/10/10 职场文书
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript