赞
踩
rsa模块是一个纯Python实现的第三方库,用于密码学中的加密和解密数据。该模块提供了函数和类来生成RSA密钥对、进行加密和解密操作,以及进行数字签名和验证等操作。
官网地址:rsa · PyPI
版本要求:Python >=3.6, <4
安装:pip install rsa
文档:Welcome to Python-RSA’s documentation! — Python-RSA 4.8 documentation
rsa模块中使用`rsa.newkeys()`函数生成RSA密钥对,这个函数会返回一个包含公钥和私钥的元组。
语法格式如下:
- newkeys(
- nbits: int,
- accurate: bool = True,
- poolsize: int = 1,
- exponent: int = DEFAULT_EXPONENT,
- ) -> typing.Tuple[PublicKey, PrivateKey]
参数说明:
用法示例如下:
- import rsa
-
- # 指定密钥的位数,例如2048
- key_size = 2048
-
- # 生成RSA密钥对
- public_key, private_key = rsa.newkeys(key_size)
-
- # 打印生成的公钥和私钥
- print("Public Key:", public_key)
- print("Private Key:", private_key)
在上面的代码中,我们使用rsa.newkeys()函数并传入密钥的位数作为参数,例如2048。函数会返回一个元组,其中第一个元素是公钥,第二个元素是私钥。我们可以打印出生成的公钥和私钥。
请注意,密钥的位数越大,安全性就越高,但生成和处理密钥的时间也会增加。一般来说,2048位的密钥已经足够安全,如果需要更高的安全性,可以选择更大的位数。
需要注意的是,使用rsa库生成的RSA密钥对是纯Python实现的,用于学习和简单应用。如果要在实际生产环境中使用RSA加密,建议使用更强大和更安全的密码学库,比如cryptography。
在Python的`rsa`库中,可以使用 `save_pkcs1()` 方法将生成的RSA密钥保存为PEM文件。
语法格式如下:
- def save_pkcs1(self, format: str = "PEM") -> bytes:
- """Saves the key in PKCS#1 DER or PEM format."""
参数说明:
下面是一个保存RSA密钥为PEM文件的示例代码:
- import rsa
-
- # 生成RSA密钥对
- (public_key, private_key) = rsa.newkeys(2048)
-
- # 将公钥保存到PEM文件中
- with open('public_key.pem', 'wb') as file:
- file.write(public_key.save_pkcs1())
-
- # 将私钥保存到PEM文件中
- with open('private_key.pem', 'wb') as file:
- file.write(private_key.save_pkcs1())
在上面的代码中,我们使用 `rsa.newkeys()` 方法生成一个2048位的RSA密钥对。然后,我们使用 `public_key.save_pkcs1()` 方法将公钥转换为PEM格式,并将其保存到名为 "public.pem" 的文件中。类似地,我们使用 `private_key.save_pkcs1()` 方法将私钥转换为PEM格式,并将其保存到名为 "private.pem" 的文件中。
保存后的PEM文件可以在其他程序中读取和使用。需要注意的是,在实际应用中,对私钥的保护要非常重要,确保只有授权的人能够访问。
在Python的rsa库中,你可以使用`load_pkcs1()`方法从PEM文件中加载PKCS#1格式的RSA密钥。
语法格式如下:
- def load_pkcs1(cls: typing.Type[T], keyfile: bytes, format: str = "PEM") -> T:
- """Loads a key in PKCS#1 DER or PEM format."""
参数说明:
以下是一个使用示例:
- import rsa
-
- # 从PEM文件中加载公钥
- with open('public_key.pem', 'rb') as file:
- public_key_data = file.read()
- public_key = rsa.PublicKey.load_pkcs1(public_key_data)
-
- # 从PEM文件中加载私钥
- with open('private_key.pem', 'rb') as file:
- private_key_data = file.read()
- private_key = rsa.PrivateKey.load_pkcs1(private_key_data)
在这个示例中,我们使用`load_pkcs1()`方法从PEM文件中加载私钥和公钥。首先,我们以二进制模式(`"rb"`)打开PEM文件,并将其读取为字节字符串。然后,我们将字节字符串传递给`load_pkcs1()`方法,从而加载RSA密钥。
使用`load_pkcs1()`方法加载密钥时,请确保PEM文件包含正确格式的RSA密钥。如果PEM文件的格式不正确,可能会导致加载失败。同时,务必保护好加载的私钥,确保只有授权的人能够访问。
5.1 加密
在`rsa`模块中,可以使用 `rsa.encrypt()` 函数来加密数据。
语法格式:
- def encrypt(message: bytes, pub_key: key.PublicKey) -> bytes:
- """Encrypts the given message using PKCS#1 v1.5"""
参数说明:
以下是一个使用 `rsa.encrypt()` 函数加密数据的示例代码:
- import rsa
-
- # 生成RSA密钥对
- public_key, private_key = rsa.newkeys(2048)
-
- # 要加密的数据
- message = b"Hello, RSA!"
-
- # 使用RSA公钥加密数据
- encrypted_data = rsa.encrypt(message, public_key)
-
- print("加密后的数据:", encrypted_data)
需要注意的是,加密后的数据是以字节串形式存储的。通常情况下,你可能需要将加密后的数据转换成可传输或存储的格式,比如Base64编码,以便后续的操作。
5.2 解密
在`rsa`模块中,可以使用 `rsa.decrypt()` 函数来解密使用RSA公钥加密的数据。
语法格式:
- def decrypt(crypto: bytes, priv_key: key.PrivateKey) -> bytes:
- r"""Decrypts the given message using PKCS#1 v1.5"""
参数说明:
以下是一个使用 `rsa.decrypt()` 函数解密数据的示例代码:
- import rsa
-
- # 生成RSA密钥对
- public_key, private_key = rsa.newkeys(2048)
-
- # 要加密的数据
- message = b"Hello, RSA!"
-
- # 使用RSA公钥加密数据
- encrypted_data = rsa.encrypt(message, public_key)
-
- # 使用RSA私钥解密数据
- decrypted_data = rsa.decrypt(encrypted_data, private_key)
-
- print("解密后的数据:", decrypted_data)
需要注意的是,解密操作需要使用与加密使用的公钥相对应的私钥。确保使用正确的私钥进行解密,以获取原始的明文数据。
6.1 签名
在`rsa`模块中,可以使用`rsa.sign`函数对数据进行签名。
语法格式:
- def sign(message: bytes, priv_key: key.PrivateKey, hash_method: str) -> bytes:
- """Signs the message with the private key."""
参数说明:
以下是一个示例代码,演示如何使用 sign() 方法使用RSA私钥对消息进行签名:
- import rsa
-
- # 生成RSA密钥对
- public_key, private_key = rsa.newkeys(2048)
-
- # 要签名的消息
- message = b"Hello, RSA!"
-
- # 使用RSA私钥对消息进行签名
- signature = rsa.sign(message, private_key, "SHA-256")
-
- print("签名结果:", signature)
需要注意的是,签名后的结果是以字节串形式存储的。通常情况下,你可能需要将签名结果转换成可传输或存储的格式,比如Base64编码,以便后续的操作。
6.2 验签(认证)
在`rsa`模块中,可以使用`rsa.verify`函数验证签名的有效性。
语法格式:
- def verify(message: bytes, signature: bytes, pub_key: key.PublicKey) -> str:
- """Verifies that the signature matches the message."""
参数说明:
以下是一个示例代码,演示如何使用 verify() 方法验证签名的有效性:
- import rsa
-
- # 生成RSA密钥对
- public_key, private_key = rsa.newkeys(2048)
-
- # 要签名的消息
- message = b"Hello, RSA!"
-
- # 使用RSA私钥对消息进行签名
- signature = rsa.sign(message, private_key, "SHA-256")
-
- # 验证签名的有效性
- verification_result = rsa.verify(message, signature, public_key)
-
- print("签名验证结果:", verification_result)
需要注意的是,签名时所使用的哈希算法与验证签名时所使用的哈希算法必须一致。
reference:
Welcome to Python-RSA’s documentation! — Python-RSA 4.8 documentation
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。