0基础学Python——字符串编码、base64编码、不可逆加密、公私钥存储、公钥加密私钥解密、签名和认证、函数标注类型
字符串编码
ASCII:美国, 26英文 和 其他特殊符号
gbk:ASCII,汉字
汉字: unicode值
因为字符串流只能包含ASCII,其他字符要转换为ASCII值
s = 'hello world'
print(s.encode('utf-8')) # b'hello world'
s = b'hello world' # 字符串流
print(s) # b'hello world'
# s = b'hello中' 先将汉字转换为asc
# E4 B8 AD
s = b'hello\xE4\xB8\xAD' # 字符串流
print(s) # b'hello\xe4\xb8\xad'
s = 'hello中国'
s = s.encode()
print(s) # b'hello\xe4\xb8\xad\xe5\x9b\xbd'
# 解码
print(s.decode()) # hello中国
在UTF-8中,一个汉字是占 3个字节
在gbk中,一个汉字是占 2个字节
0100 1110 0010 1101 2个字节
1110 0100 1011 1000 1010 1101 2个字节
E 4 B 8 A D
2个字节 转换为 3个字节:
1.在第一个字节前加 1110
2.在第二个字节前加 10
3.在第三个字节前加 10
print(ord('中')) # 20013
print(ord('国')) # 22269
base64编码
base64编码: 继续对字符串流进行编码,返回字符串流 0-f
由于ascii码的128~255之间的值是不可见字符,base64编码可以避免不可见字符的传输错误
base64编码的字符串,更适合不同平台、不同语言的传输
Base64 编解码的应用场景:
1. 发送邮件、接收邮件
2. 主流的下载器中使用,例如 迅雷、QQ旋风、快车
3. 图片的字符串表示形式
4. 数字签名和认证
import base64
s = 'hello'
# 编码
s = base64.b64encode(s.encode())
print(s) # b'aGVsbG8='
# 解码
print(base64.b64decode(s).decode()) # hello
地址解码-1
# 迅雷地址解码
s = 'thunder://QUFodHRwczovL3d3dy55dW53ZWlrdS5jb20vdXJsLmh0bWxaWg=='
s = s.removeprefix('thunder://')
s = base64.b64decode(s.encode()).decode()
print(s) # AAhttps://www.yunweiku.com/url.htmlZZ
s = s.removeprefix('AA').removesuffix('ZZ')
print(s) # https://www.yunweiku.com/url.html
s1 = 'https://www.yunweiku.com/url.html'
s1 = base64.b64encode(('AA' + s1 + 'ZZ').encode()).decode()
print(s1) # QUFodHRwczovL3d3dy55dW53ZWlrdS5jb20vdXJsLmh0bWxaWg==
# 编码
s = base64.b64encode(('AA' + s + 'ZZ').encode()).decode()
print('thunder://' + s) # thunder://QUFodHRwczovL3d3dy55dW53ZWlrdS5jb20vdXJsLmh0bWxaWg==
地址解码-2
# 飘花电影网
# magnet:?xt=urn:btih:f935643c7a1cabea7c0df7bd6c7f45efa09ed575&dn=环孩子的天空-1996 BD日语中字].mp4
s = 'magnet:?xt=urn:btih:f935643c7a1cabea7c0df7bd6c7f45efa09ed575&a=1&dn=环孩子的天空-1996 BD日语中字].mp4'
s = s.split('&')[0]
s = s.removeprefix('magnet:?xt=urn:btih:')
print(s) # f935643c7a1cabea7c0df7bd6c7f45efa09ed575
s = base64.b64decode(s.encode())
print(s) # b'\x7f\xdd\xf9\xeb\x8d\xdc\xed\xad\\i\xb7\x9a\xed\xcd\x1d\x7f\xb6\xdd\xe9\xce\xdf\xe3\x97\x9fkO^w\x9e\xf9'
不可逆加密
加密的作用:
防止信息传输过程中被篡改
保证信息传输的安全性
加密:
对称加密: 加密和解密 同一个 密钥,例如,AES,DES等
非对称加密: 公钥加密,私钥解密 例如,RSA等
不可逆加密: 不能解密,采用的是hash算法 例如,MD5,SHA256等
md5加密
s = '123456'
sm = hashlib.md5(s.encode()).hexdigest()
print(sm) # e10adc3949ba59abbe56e057f20f883e
sha256加密
sh = hashlib.sha256(s.encode()).hexdigest()
print(sh) # 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
公私钥存储
非对称加密: 公钥加密,私钥解密 例如,RSA等
获取密钥对
nbit:2的幂次方,一般1024起步
public_key, private_key = rsa.newkeys(2048)
获取字符串流
public_key_bytes = public_key.save_pkcs1()
private_key_bytes = private_key.save_pkcs1()
存储到文件
wb:以二进制写入
with open('./public.pem', 'wb') as f:
f.write(public_key_bytes)
with open('./private.pem', 'wb') as f:
f.write(private_key_bytes)
运行结束后,在同级目录下即可看到public.pem和private.pem,且private.pem比public.pem长。
公钥加密私钥解密
公钥加密
1.字符串信息
msg = 'who are you'
2.获取公钥字节流
public_key_bytes = open('./public.pem','rb').read()
3.获取公钥
public_key = rsa.PublicKey.load_pkcs1(public_key_bytes)
4.encrypt加密
res = rsa.encrypt(msg.encode(),public_key)
5.base64编码
s = base64.b64encode(res).decode()
print(s) # Qw1o1187l2xn0Ty9TSOl7RzsFar6aQxue9RkF771e6mffQtp5JF9YxLGrrPdaV93ROZb5VZDfDyrudWeKDz0lDxaQ3YALDZA1ZP33E2PndHdujhdk/T4Sca6/pXBvh5LtlGbiUs+9FyX8hwerumgGVVKnMxZztHzIUE/60xqrBpnF73rVheh+y/WvFVo69cT9X+DF+F3lcis/q2qGRwrpuuZ/3Sk0+8uIxSj9VtYWTGIHbj11tLtW8JhrIAGZBVXrkqJiR2GxXgNw8eh7FxxPeJMr66z8fSRo1/vMeW5ZFrZXhIWzeGRj47pJSLActsYT4Gacq//Fn7RDgxwxJDpDg==
私钥解密
1.获取私钥字节流
private_key_bytes = open('./private.pem','rb').read()
2.获取私钥
private_key = rsa.PrivateKey.load_pkcs1(private_key_bytes)
3.base64解码
bs = base64.b64decode(s.encode())
print(bs) # b'C\rh\xd7_;\x97lg\xd1<\xbdM#\xa5\xed\x1c\xec\x15\xaa\xfai\x0cn{\xd4d\x17\xbe\xf5{\xa9\x9f}\x0bi\xe4\x91}c\x12\xc6\xae\xb3\xddi_wD\xe6[\xe5VC|<\xab\xb9\xd5\x9e(<\xf4\x94<ZCv\x00,6@\xd5\x93\xf7\xdcM\x8f\x9d\xd1\xdd\xba8]\x93\xf4\xf8I\xc6\xba\xfe\x95\xc1\xbe\x1eK\xb6Q\x9b\x89K>\xf4\\\x97\xf2\x1c\x1e\xae\xe9\xa0\x19UJ\x9c\xccY\xce\xd1\xf3!A?\xebLj\xac\x1ag\x17\xbd\xebV\x17\xa1\xfb/\xd6\xbcUh\xeb\xd7\x13\xf5\x7f\x83\x17\xe1w\x95\xc8\xac\xfe\xad\xaa\x19\x1c+\xa6\xeb\x99\xfft\xa4\xd3\xef.#\x14\xa3\xf5[XY1\x88\x1d\xb8\xf5\xd6\xd2\xed[\xc2a\xac\x80\x06d\x15W\xaeJ\x89\x89\x1d\x86\xc5x\r\xc3\xc7\xa1\xec\\q=\xe2L\xaf\xae\xb3\xf1\xf4\x91\xa3_\xef1\xe5\xb9dZ\xd9^\x12\x16\xcd\xe1\x91\x8f\x8e\xe9%"\xc0r\xdb\x18O\x81\x9ar\xaf\xff\x16~\xd1\x0e\x0cp\xc4\x90\xe9\x0e'
4.decrypt解密
msg = rsa.decrypt(bs,private_key)
print(msg.decode()) # who are you
签名和认证
数字签名 (私钥签名) : 数据在互联网中进行传输的时候,可能会被 恶意软件、黑客等抓包、伪造等攻击。 此时 如果 该数据 不希望 被 劫持者 篡改 、那么需要将 该数据 进行 签名
数字认证 (公钥认证) : 使用者可以对获取的数据 进行 校验、防止在传输过程中 被篡改 ~
私钥签名
import base64
import rsa
from urllib.parse import quote, unquote
msg = 'who are you'
1.获取私钥字段
private_key_bytes = open('./private.pem','rb').read()
2.获取私钥对象
private_key = rsa.PrivateKey.load_pkcs1(private_key_bytes)
3.签名
sing_text = rsa.sign(msg.encode(),private_key,'MD5')
4.base64编码
s = base64.b64encode(sign_text).decode()
5.url编码
由于特殊字符在url网络传输时,会进行编码,我们需要自行url编码
s = quote(s)
公钥认证
1.获取公钥字符串流
public_key_bytes = open('./public.pem','rb').read()
2.获取公钥对象
public_key = rsa.PublicKey.load_pkcs1(public_key_bytes)
3.url解码
s = unquote(s)
4.base64解码
s = base64.b64decode(s.encode())
5.认证
认证成功 => 返回算法
认证失败 => 抛出验证异常错误
hash_method = rsa.verify(msg.encode(),s,public_key)
print(hash_method) # md5
函数标注类型
from typing import List, Tuple, Any, Union, Dict
def test(a: int, b: str) -> str:
pass
def test(a: List[int], b: Tuple[str]) -> List[bool]:
pass
# Union 混合数据类型 Any:任意类型
def test(a: Any, b: Tuple[str]) -> List[Union[int, str]]:
pass
def test(a: Any, b: Dict[str, int]) -> List[Union[int, str]]:
pass
标签:编码,公钥,加密,Python,base64,key,print,私钥
From: https://blog.csdn.net/2201_75539182/article/details/143817274