Python常见加密⽅式总结和实现
⼀、前⾔
我们所说的加密⽅式,都是对⼆进制编码的格式进⾏加密的,对应到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编码的原理
1. 将所有字符转化为ASCII码
2. 将ASCII码转化为8位⼆进制
3. 将⼆进制3个归成⼀组(不⾜3个在后边补0)共24位,再拆分成4组,每组6位
4. 统⼀在6位⼆进制前补两个0凑⾜8位
5. 将补0后的⼆进制转为⼗进制
6. 从Base64编码表获取⼗进制对应的Base64编码
3、Base64编码的说明
1. 转换的时候,将三个byte的数据,先后放⼊⼀个24bit的缓冲区中,先来的byte占⾼位
2. 数据不⾜3byte的话,于缓冲区中剩下的bit⽤0补⾜。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出
3. 不断进⾏,直到全部输⼊数据转换完成
4. 如果最后剩下两个输⼊数据,在编码结果后加1个“=”
5. 如果最后剩下⼀个输⼊数据,编码结果后加2个“=”
6. 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性
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(de('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、特点
1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的
2. 容易计算:从原数据计算出MD5值很容易
3. 抗修改性:对原数据进⾏任何改动,哪怕只修改1个字节,所得到的MD5值都有很⼤区别
4. 强抗碰撞:已知原数据和其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 ='中国你好'
在线url网址编码解码# 创建md5对象,
# md5对象,md5不能反解,但是加密是固定的,就是关系是⼀⼀对应,所以有缺陷,可以被对撞出来
hl = hashlib.md5()
# 此处必须声明encode
# 若写法为hl.update(origin_str)  报错为: Unicode-objects must be encoded before hashing
hl.update(de(encoding='utf-8'))# 对字符串进⾏加密
print('MD5加密前为:'+ origin_str)# MD5加密前为:中国你好
# hl.hexdigest())    # 拿到加密字符串
print('MD5加密后为:'+ hl.hexdigest())# MD5加密后为:560a6b11a85d436acfa4bd7f34462f40
# .md5时带参数
hash3 = hashlib.md5(bytes('abd',encoding='utf-8'))
'''
如果没有参数,所以md5遵守⼀个规则,⽣成同⼀个对应关系,如果加了参数,
就是在原先加密的基础上再加密⼀层,这样的话参数只有⾃⼰知道,防⽌被撞库,
因为别⼈永远拿不到这个参数
'''
hash3 .update(bytes("admin",encoding="utf-8"))
print(hash3.hexdigest())# 9aea3c0a6c51555c1a4d0a5e9b689ded
import hashlib
origin_str ='Hello Python!'
# md5加密
h_md5 = hashlib.md5()
h_md5.update(de('utf8'))
digest_str = h_md5.hexdigest()
print("md5加密: %s"% digest_str)# md5加密: c0a5ef1508044415ffd76c57ebd51b19
# 添加⾃定义key加密
h_md5_key = hashlib.md5('CoderPig'.encode('utf8'))
h_md5.update(de('utf8'))
digest_str = h_md5.hexdigest()
print("带key md5加密后: %s"% digest_str)# 带key md5加密后: 27fd294cd16301d09a5e94840763c43b import hashlib
# md5  两个结果⼀样
print(hashlib.md5('要加密的⽂本'.encode()).hexdigest())
hl = hashlib.md5()
hl.update('要加密的⽂本'.encode())
print(hl.hexdigest())
# .md5时带参数(key)  两层md5
# hash3 = hashlib.md5()  # 此处若⽆参数和上⾯单纯的md5的结果⼀样
hash3 = hashlib.md5(bytes('abd', encoding='utf-8'))# ⽤bytes编码和.encode⼀样
hash3 .update(bytes('要加密的⽂本', encoding='utf-8'))
print(hash3.hexdigest())
MD5不仅仅是上⾯这个例⼦这样⽤来处理字符串,还有更⼴泛的⽤途:
加密⽹站注册⽤户的密码:(但各⼤⽹站密码泄漏事件确实让⼈蛋疼……)
⽹站⽤户上传图⽚ / ⽂件后,计算出MD5值作为⽂件名:(MD5可以保证唯⼀性)
key-value数据库中使⽤MD5值作为key
⽐较两个⽂件是否相同:(⼤家在下载⼀些资源的时候,就会发现⽹站提供了MD5值,就是⽤来检测⽂件是否被篡改)其他…
处理⼤⽂件:
上⾯说过可以⽤MD5来检测两个⽂件是否相同,但想想,如果是两个很⼤的⽂件,担⼼内存不够⽤,这时怎么办?
这就要使⽤ update ⽅法了:
import hashlib
def get_file_md5(f):
m = hashlib.md5()
while True:
data = f.read(10240)
if not data:
break
m.update(data)
return m.hexdigest()
with open(YOUR_FILE,'rb')as f:
file_md5 = get_file_md5(f)
这⾥写⼀个利⽤md5进⾏⽤户登陆⽹站进⾏注册之后密码加密的基本事例,加深理解

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。