Python实现最常见加密方式详解


Posted in Python onJuly 13, 2019

前言

我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。

所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。

将字符串和Bytes互相转换可以使用encode()和decode()方法。如下所示:

# 方法中不传参数则是以默认的utf-8编码进行转换In [1]: '南北'.encode()Out[1]: b'\xe5\x8d\x97\xe5\x8c\x97'In [2]: b'\xe5\x8d\x97\xe5\x8c\x97'.decode()Out[2]: '南北'

注:两位十六进制常常用来显示一个二进制字节。

利用binascii模块可以将十六进制显示的字节转换成我们在加解密中更常用的显示方式:

In [1]: import binasciiIn [2]: '南北'.encode()Out[2]: b'\xe5\x8d\x97\xe5\x8c\x97'In [3]: binascii.b2a_hex('南北'.encode())Out[3]: b'e58d97e58c97'In [4]: binascii.a2b_hex(b'e58d97e58c97')Out[4]: b'\xe5\x8d\x97\xe5\x8c\x97'In [5]: binascii.a2b_hex(b'e58d97e58c97').decode()Out[5]: '南北'

URL编码

简介

正常的URL中是只能包含ASCII字符的,也就是字符、数字和一些符号。而URL编码就是一种浏览器用来避免url中出现特殊字符(如汉字)的编码方式。

其实就是将超出ASCII范围的字符转换成带%的十六进制格式。

Python实现

In [1]: from urllib import parse# quote()方法会自动将str转换成bytes,所以这里传入str和bytes都可以In [2]: parse.quote('南北')Out[2]: '%E5%8D%97%E5%8C%97'In [3]: parse.unquote('%E5%8D%97%E5%8C%97')Out[3]: '南北'

Base64编码

简述

Base64是一种用64个字符来表示任意二进制数据的方法。

Base64编码可以成为密码学的基石。可以将任意的二进制数据进行Base64编码。所有的数据都能被编码为并只用65个字符就能表示的文本文件。( 65字符:A~Z a~z 0~9 + / = )编码后的数据~=编码前数据的4/3,会大1/3左右。

Base64编码的原理

Python实现最常见加密方式详解

  • 将所有字符转化为ASCII码。
  • 将ASCII码转化为8位二进制 。
  • 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位。
  • 统一在6位二进制前补两个0凑足8位。
  • 将补0后的二进制转为十进制。
  • 从Base64编码表获取十进制对应的Base64编码。

Base64编码的说明

  • 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
  • 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
  • 不断进行,直到全部输入数据转换完成。
  • 如果最后剩下两个输入数据,在编码结果后加1个“=”。
  • 如果最后剩下一个输入数据,编码结果后加2个“=”。
  • 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

Python的Base64使用

Python内置的base64模块可以直接进行base64的编解码

注意:用于base64编码的,要么是ASCII包含的字符,要么是二进制数据

In [1]: import base64In [2]: base64.b64encode(b'hello world')Out[2]: b'aGVsbG8gd29ybGQ='In [3]: base64.b64decode(b'aGVsbG8gd29ybGQ=')Out[3]: b'hello world'

MD5(信息-摘要算法)

简述

message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是它信息-摘要算法。

md5,其实就是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。

不可逆性

每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。

特点

  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  • 容易计算:从原数据计算出MD5值很容易。
  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  • 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

举个栗子:世界上只有一个我,但是姑娘却是非常非常多的,以一个有限的我对几乎是无限的姑娘,所以可能能搞定非常多(100+)的妞,这个理论上的确是通的,可是实际情况下....

Python的MD5使用

由于MD5模块在python3中被移除,在python3中使用hashlib模块进行md5操作

import hashlib# 待加密信息str = '这是一个测试'# 创建md5对象hl = hashlib.md5()# 此处必须声明encode# 若写法为hl.update(str) 报错为: Unicode-objects must be encoded before hashinghl.update(str.encode(encoding='utf-8'))print('MD5加密前为 :' + str)print('MD5加密后为 :' + hl.hexdigest())

运行结果

MD5加密前为 :这是一个测试MD5加密后为 :cfca700b9e09cf664f3ae80733274d9f

MD5长度

md5的长度,默认为128bit,也就是128个0和1的二进制串。这样表达是很不友好的。所以将二进制转成了16进制,每4个bit表示一个16进制,所以128/4 = 32 换成16进制表示后,为32位了。

为什么网上还有md5是16位的呢?

其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。

Python加密库PyCryptodome

PyCrypto是 Python 中密码学方面最有名的第三方软件包。可惜的是,它的开发工作于2012年就已停止。

幸运的是,有一个该项目的分支PyCrytodome 取代了 PyCrypto 。

安装与导入

安装之前需要先安装Microsoft Visual c++ 2015。

在Linux上安装,可以使用以下 pip 命令:

pip install pycryptodome

导入:

import Crypto

在Windows 系统上安装则稍有不同:

pip install pycryptodomex

导入:

import Cryptodome

DES

简介

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。

DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。

DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中tell()方法的使用详解
May 24 Python
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
Python 内置函数complex详解
Oct 23 Python
pycharm远程调试openstack代码
Nov 21 Python
Flask框架信号用法实例分析
Jul 24 Python
Pycharm取消py脚本中SQL识别的方法
Nov 29 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
python多进程下的生产者和消费者模型
May 07 Python
用python批量解压带密码的压缩包
May 31 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 #Python
简单了解python反射机制的一些知识
Jul 13 #Python
Python3内置模块之base64编解码方法详解
Jul 13 #Python
Python3enumrate和range对比及示例详解
Jul 13 #Python
基于Python的ModbusTCP客户端实现详解
Jul 13 #Python
Python Numpy库datetime类型的处理详解
Jul 13 #Python
Python3内置模块random随机方法小结
Jul 13 #Python
You might like
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
jquery中实现标签切换效果的代码
2011/03/01 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python实现的防DDoS脚本
2011/02/08 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
python矩阵的转置和逆转实例
2018/12/12 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
python如何保证输入键入数字的方法
2019/08/23 Python
opencv python如何实现图像二值化
2020/02/03 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
迟到检讨书900字
2014/01/14 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
精彩的广告词
2014/03/19 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
矛盾论读书笔记
2015/06/29 职场文书