python模块 — cryptography(未完)

1、cryptography模块介绍

Cryptography模块是一个包含各种加密算法和协议的Python库,它提供了对数据进行加密、解密和签名的功能。使用cryptography模块,你可以实现对称加密、非对称加密、哈希算法等操作,帮助保护数据的安全性和隐私。

官网地址:cryptography · PyPI

版本要求:Python 3.7+

安装:pip install cryptography

文档:Welcome to pyca/cryptography — Cryptography 42.0.0.dev1 documentation

2、生成秘钥

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()`方法获得了对应的公钥对象。最后,我们打印出公钥对象以验证结果。

请注意,私钥和公钥配对使用,私钥用于加密和签名,而公钥用于解密和验证签名。私钥是敏感信息,需要妥善保管,不应泄露给他人。公钥可以公开传播给其他人,以便其他人使用。

3、序列化秘钥

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

你可能感兴趣的:(Python模块,python,加解密,秘钥,rsa,cryptography)