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实现获取序列中最小的几个元素
Sep 25 Python
python实现挑选出来100以内的质数
Mar 24 Python
Python的Tornado框架异步编程入门实例
Apr 24 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
python交互界面的退出方法
Feb 16 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 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类的自动加载与命名空间用法实例分析
2020/06/05 PHP
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
李培根演讲稿
2014/05/22 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
爱护公物主题班会
2015/08/17 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
Linux中文件的基本属性介绍
2022/06/01 Servers