【Python】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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值