一、前言
我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。
所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。
将字符串和Bytes互相转换可以使用encode()
和decode()
方法。
# 方法中不传参数则是以默认的utf-8编码进行转换
a = "中国欢迎您".encode("utf-8")
print(a) # b'\xe4\xb8\xad\xe5\x9b\xbd\xe6\xac\xa2\xe8\xbf\x8e\xe6\x82\xa8'
b = a.decode("utf-8")
print(b) # 中国欢迎您
\x开头 后面是两位十六进制
b’\xe4\xb8\xad\xe5\x9b\xbd\xe6\xac\xa2\xe8\xbf\x8e\xe6\x82\xa8’
两位十六进制常常用来显示一个二进制字节
利用binascii模块可以将十六进制显示的字节转换成我们在加解密中更常用的显示方式
import binascii
# 方法中不传参数则是以默认的utf-8编码进行转换
a = "中国欢迎您".encode("utf-8")
print(a) # b'\xe4\xb8\xad\xe5\x9b\xbd\xe6\xac\xa2\xe8\xbf\x8e\xe6\x82\xa8'
c = binascii.b2a_hex('中国欢迎您'.encode())
print("c===",c) # c=== b'e4b8ade59bbde6aca2e8bf8ee682a8'
d = binascii.a2b_hex(c)
print(d) # b'\xe4\xb8\xad\xe5\x9b\xbd\xe6\xac\xa2\xe8\xbf\x8e\xe6\x82\xa8'
v = binascii.a2b_hex(c).decode("utf-8")
print(v) # 中国欢迎您
b = a.decode("utf-8")
print(b) # 中国欢迎您
二、URL编码
1、简介
正常的URL中是只能包含ASCII字符的,也就是字符、数字和一些符号。而URL编码就是一种浏览器用来避免url中出现特殊字符(如汉字)的编码方式。其实就是将超出ASCII范围的字符转换成带%的十六进制格式。
2、Python实现
from urllib import parse
a = parse.quote("中国欢迎您")
print(a) # %E4%B8%AD%E5%9B%BD%E6%AC%A2%E8%BF%8E%E6%82%A8
b = parse.unquote(a)
print(b) # 中国欢迎您
更多有关Bytes字节码编码和url编码的知识 可参考之前的文章
三、Base64编码
1、简介
Base64是一种用64个字符来表示任意二进制数据的方法。
Base64编码可以成为密码学的基石。可以将任意的二进制数据进行Base64编码。所有的数据都能被编码为并只用65个字符就能表示的文本文件。(65字符:A~Z a~z 0~9 + / =)编码后的数据~=编码前数据的4/3,会大1/3左右。
2、Base64编码的原理
- 将所有字符转化为ASCII码
- 将ASCII码转化为8位二进制
- 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位
- 统一在6位二进制前补两个0凑足8位
- 将补0后的二进制转为十进制
- 从Base64编码表获取十进制对应的Base64编码
3、Base64编码的说明
- 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位
- 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出
- 不断进行,直到全部输入数据转换完成
- 如果最后剩下两个输入数据,在编码结果后加1个“=”
- 如果最后剩下一个输入数据,编码结果后加2个“=”
- 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性
4、Python的Base64使用
Python内置的base64模块可以直接进行base64的编解码
注意:
用于base64编码的,要么是ASCII包含的字符,要么是二进制数据
输入的base64编码字符串必须符合base64的padding规则:当原数据长度不是3的整数倍时:剩下2个输入数据,编码结果后加一个'=';剩下1个输入数据,编码结果加2个'='
。以确保资料还原的正确性,否则会报:binascii.Error: Incorrect padding 的错误!!!
import base64
a = base64.b64encode(b"hello world")
print(a) # b'aGVsbG8gd29ybGQ='
b = base64.b64decode(a)
print(b) # b'hello world'
import base64
test_str = "一段等待Base64编码的字符串"
# 编码(转换为二进制才可以进行编码)
encode_str = base64.b64encode(test_str.encode('utf-8'))
print("编码后:", encode_str)
# 解码(解码后为二进制,同样要转换下)
decode_str = base64.b64decode(encode_str)
print("解码后:", decode_str.decode('utf-8'))
四、MD5(信息-摘要算法)
1、简述
message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是信息-摘要算法。
md5,其实就是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。
2、不可逆性
每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。
3、特点
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的
- 容易计算:从原数据计算出MD5值很容易
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的
举个栗子:世界上只有一个王思聪,但是妞却是非常非常多的,以一个有限的王思聪对几乎是无限的妞,所以可能搞定非常多(100+)的妞,这个理论上的确是通的,可是实际情况下…
4、Python的MD5使用
由于MD5模块在python3中被移除,在python3中使用hashlib模块进行md5操作
hashlib整合了md5和sha模块,支持下面这些加密算法:
__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
'blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
'shake_128', 'shake_256')
可通过下述属性查看hash对象的相关信息:
- name:查看当前hash对象的加密算法
- digest_size:hash密文占多少个字节
- block_size:hash数据库的大小
import hashlib
# 待加密信息
origin_str = '中国你好'
# 创建md5对象,
# md5对象,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
hl = hashlib.md5()
# 此处必须声明encode
# 若写法为hl.update(origin_str) 报错为: Unicode-objects must be encoded before hashing
hl.update