Cryptography模块是一个包含各种加密算法和协议的Python库,它提供了对数据进行加密、解密和签名的功能。使用cryptography模块,你可以实现对称加密、非对称加密、哈希算法等操作,帮助保护数据的安全性和隐私。
官网地址:cryptography · PyPI
版本要求:Python 3.7+
安装:pip install cryptography
文档:Welcome to pyca/cryptography — Cryptography 42.0.0.dev1 documentation
1.1 生成私钥
在cryptography模块中,使用rsa模块的generate_private_key()方法生成了一个RSA私钥对象。
语法格式:
def generate_private_key(
public_exponent: int, key_size: int, backend=None
) -> RSAPrivateKey
参数说明:
1. `public_exponent`(公钥指数):
类型:`int`(整数)
公钥指数是RSA算法中公钥的一部分,通常选择一个固定的值,如65537(即0x10001)。这是一个安全且常见的选项。
2. `key_size`(密钥长度):
类型:`int`(整数)
密钥长度用于确定生成的RSA私钥的强度,即位数。常见的密钥长度包括2048、3072和4096等。较长的密钥长度提供更大的安全性,但也需要更长的加密和解密时间。
3. `backend`(后端):
类型:可选参数,默认值为 `None`
这个参数用于指定加密库的后端实现。如果不提供后端参数,默认情况下将使用适当的后端。
返回类型:
`RSAPrivateKey`:
这是 `cryptography.hazmat.primitives.asymmetric.rsa` 模块中表示RSA私钥的类类型。
以下是一个使用`generate_private_key()`方法的示例:
from cryptography.hazmat.primitives.asymmetric import rsa
# 生成RSA私钥
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
# 输出私钥对象
print(private_key)
在上面的示例中,`generate_private_key()`方法生成了一个RSA私钥对象。我们使用参数`public_exponent=65537`和`key_size=2048`来定义生成的私钥的公钥指数和密钥长度。最后,我们打印私钥对象以验证生成的结果。
请注意,私钥是非常敏感的信息,需要妥善保管,并在必要时进行严格的访问控制。
1.2 生成公钥
在`cryptography`库中,可以通过私钥生成对应的公钥。公钥可以通过私钥对象的`public_key()`方法获得公钥对象。
语法格式:
def public_key(self) -> "RSAPublicKey":
"""
The RSAPublicKey associated with this private key.
"""
以下是使用私钥生成公钥的示例代码:
from cryptography.hazmat.primitives.asymmetric import rsa
# 假设私钥对象为 private_key
# 获取关联的公钥对象
public_key = private_key.public_key()
# 输出公钥对象
print(public_key)
在上述示例中,我们使用私钥对象的`public_key()`方法获得了对应的公钥对象。最后,我们打印出公钥对象以验证结果。
请注意,私钥和公钥配对使用,私钥用于加密和签名,而公钥用于解密和验证签名。私钥是敏感信息,需要妥善保管,不应泄露给他人。公钥可以公开传播给其他人,以便其他人使用。
2.1 序列化私钥
在cryptography库中,可以使用serialization模块中的private_bytes()函数将私钥序列化为字节流表示。
语法格式:
def private_bytes(
self,
encoding: _serialization.Encoding,
format: _serialization.PrivateFormat,
encryption_algorithm: _serialization.KeySerializationEncryption,
) -> bytes:
"""
Returns the key serialized as bytes.
"""
参数说明:
1. `encoding`(编码):
类型:`_serialization.Encoding`
这个参数用于指定私钥在序列化时使用的编码方式。`_serialization.Encoding` 是一个枚举类,常用的取值包括:
- `PEM`:使用 Base64 编码将私钥序列化为文本格式。
- `DER`:将私钥序列化为二进制格式。
2. `format`(私钥格式):
类型:`_serialization.PrivateFormat`
这个参数用于指定私钥序列化时的格式。`_serialization.PrivateFormat` 是一个枚举类,常用的取值包括:
- `PKCS8`:使用 PKCS#8 格式序列化私钥。
- `TraditionalOpenSSL`:使用传统的 OpenSSL 格式序列化私钥。
3. `encryption_algorithm`(加密算法):
类型:`_serialization.KeySerializationEncryption`
这个参数用于指定是否对私钥进行加密。`_serialization.KeySerializationEncryption` 是一个枚举类,常用的取值包括:
- `NoEncryption`:不对私钥进行加密,私钥将以明文形式序列化。
- `BestAvailableEncryption`:使用可用的最佳加密算法对私钥进行加密。
返回类型:
`bytes`:私钥序列化后的字节流表示。
以下是将私钥序列化为字节流的示例代码:
from cryptography.hazmat.primitives import serialization
# 假设私钥对象为 private_key
# 将私钥使用 PEM 格式序列化为文本格式
private_key_bytes = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
print(private_key_bytes)
在上述示例中,我们使用 `private_bytes()` 方法将私钥序列化为字节流表示。我们指定了参数 `encoding` 为 `PEM`,`format` 为 `PKCS8`,`encryption_algorithm` 为 `NoEncryption`,表示不对私钥进行加密。通过打印 `private_key_bytes` 可以查看私钥的字节流表示。
2.2 序列化公钥
在`cryptography`库中,可以使用`serialization`模块中的`public_bytes()`函数将公钥序列化为字节流表示。
语法格式:
def public_bytes(
self,
encoding: _serialization.Encoding,
format: _serialization.PublicFormat,
) -> bytes:
"""
Returns the key serialized as bytes.
"""
参数说明:
1. `encoding`(编码):
类型:`_serialization.Encoding`
这个参数用于指定序列化公钥时使用的编码方式。`_serialization.Encoding` 是一个枚举类,常用的取值包括:
- `PEM`:使用 Base64 编码将公钥序列化为文本格式。
- `DER`:将公钥序列化为二进制格式。
2. `format`(公钥格式):
类型:`_serialization.PublicFormat`
这个参数用于指定公钥序列化时的格式。`_serialization.PublicFormat` 是一个枚举类,常用的取值包括:
- `SubjectPublicKeyInfo`:使用 SubjectPublicKeyInfo 格式序列化公钥。
返回类型:
`bytes`:公钥序列化后的字节流表示。
以下是将公钥序列化为字节流的示例代码:
from cryptography.hazmat.primitives import serialization
# 假设公钥对象为 public_key
# 使用 PEM 格式将公钥序列化为字节流
public_key_bytes = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print(public_key_bytes)
在上面的示例中,我们使用公钥对象的`public_bytes()`方法将公钥序列化为字节流。其中,我们指定了序列化的格式为PEM,并且使用`SubjectPublicKeyInfo`格式表示公钥。
通过选择适当的编码方式(如PEM或DER)以及公钥的格式(如SubjectPublicKeyInfo),可以将公钥序列化为字节流。这样,您可以将公钥保存到文件或通过网络传输,以便其他人使用。
reference:
cryptography · PyPI
Welcome to pyca/cryptography — Cryptography 42.0.0.dev1 documentation