首页 > 编程语言 >【Python】0基础学Python——字符串编码、base64编码、不可逆加密、公私钥存储、公钥加密私钥解密、签名和认证、函数标注类型

【Python】0基础学Python——字符串编码、base64编码、不可逆加密、公私钥存储、公钥加密私钥解密、签名和认证、函数标注类型

时间:2024-11-21 18:46:29浏览次数:3  
标签:编码 公钥 加密 Python base64 key print 私钥

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

相关文章

  • 【Python】0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、p
    0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、pickle序列化、序列化升级函数参数传递参数传递类型标注函数细分task任务型函数consumer消费型函数functional功能型函数类的信息元类type作用自定义元类pickle序列化序列化反序列化序列化升......
  • 重生之我在Python中计算圆的周长和面积(第三章)
     ‘系统,你便用这些来搪塞朕吗,你寄身于孤,也要拿出些诚意来!’听到我的话,系统不禁打了个寒颤‘这世上竟有和我讨价还价的宿主,也罢,如今也是有求于他,便再展示一般吧!’系统内心不禁感慨随后荧光乍现,又一串神秘数字出现在眼前(不二家.jdp)             ......
  • python-5-常用模块
    python-5-常用模块什么是模块?  常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。  但其实import加载的模块分为四个通用类别:1使用python编写的代码(.py文件)2已被编译为共享库或DLL的C或C++扩展3包好一组模......
  • AES加密
    在数字化时代,数据安全成为了企业和个人关注的焦点。AES(高级加密标准)作为一种广泛采用的对称加密算法,因其高效性和安全性,在保护敏感信息方面发挥着重要作用。本文将深入探讨AES加密的工作原理、优势、实现方法以及在实际应用中的注意事项。一、AES加密简介1.1AES的历史与发展AE......
  • Python 入门(小白版)の7个基础代码 @Kerin森森
    Python,据说是很好入门的一门编程语言,so它也变成了0基础的我(@Kerin森森)的入门选择,在这里分享一下自己的一些学习记录and心得吧。如果你也和我一样是初学者,那就跟森森一起学习一起进步吧!1.第一个Python程序:HelloWorld每个程序员的旅程几乎都是从打印“Hello,World!”开始的......
  • 【python系列】python数据类型之列表
    一、什么是列表在Python中,列表(List)是一种用于存储有序数据的容器。它的特性包括:有序性:列表中的元素有固定的顺序。可变性:可以修改列表中的元素。支持任意数据类型:列表中的元素可以是数字、字符串、布尔值,甚至是其他列表。通过索引访问:列表使用从0开始的索引定位元素......
  • 【python图解】Python 数据结构之列表和元组
    【python图解】Python数据结构之列表和元组顾名思义,数据结构是能够将数据组合在一起的一种结构。在数学中,很多情况下需要将数据进行有序排列。例如我们统计了某班50人的数据成绩,那么一共50个人。例如Alice=99,Bob=86....无疑是非常繁琐的。这时我们可以通过数......
  • 利用 Python 和 Selenium 高效启动和管理 Chrome 浏览器
    在自动化测试和网页抓取的过程中,Selenium是最常用的工具之一。其强大的功能可以与浏览器无缝集成,实现复杂的操作。然而,为了提高效率和扩展性,尤其在处理大量任务时,我们可以通过定制化的方法启动Chrome浏览器并与Selenium驱动连接。本文将详细解析两段关键代码,实现以下目标:......
  • 【C语言】自编码器
    描述一下你对自编码器的理解,包括变分自编码器和生成对抗自编码器等。 自编码器(Autoencoder,AE)是一种无监督学习模型,主要用于数据压缩和特征学习。它的基本思想是通过一个编码器网络将输入数据压缩成低维潜在向量,然后通过一个解码器网络尝试从这个潜在向量重构出原始输入。如......
  • 《Python游戏编程入门》注-第7章
    《Python游戏编程入门》第7章“用精灵实现动画:EscapetheDragon游戏”中通过pygame.sprite模块(精灵)实现了动画效果。1通过精灵实现动画“7.2使用Pygame精灵”中实现了飞龙飞翔的效果,如图1所示。图1飞龙飞翔的效果注意1相关代码及资源,请参考《Python游戏编程入门注-第......