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 25 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
详解如何设置Python环境变量?
May 13 Python
Python比较配置文件的方法实例详解
Jun 06 Python
Python3 实现串口两进程同时读写
Jun 12 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
python实现文件的分割与合并
Aug 29 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
Python正则re模块使用步骤及原理解析
Aug 18 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
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
php实现中文转数字
2016/02/18 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
动态刷新 dorado树的js代码
2009/06/12 Javascript
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
js 中 document.createEvent的用法
2010/08/29 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
django实现前后台交互实例
2017/08/07 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
python取余运算符知识点详解
2019/06/27 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python中树与树的表示知识点总结
2019/09/14 Python
python如何实现单链表的反转
2020/02/10 Python
Python中logging日志库实例详解
2020/02/19 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
提高python代码运行效率的一些建议
2020/09/29 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
房屋租赁意向书范本
2015/05/09 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
php微信小程序解包过程实例详解
2021/03/31 PHP
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android