python基于RSA的非对称数字签名
时间: 2023-06-28 18:13:30 浏览: 83
Python中有一个名为`cryptography`的库,它提供了RSA算法的实现,可以用于数字签名。
以下是使用RSA算法进行数字签名的基本步骤:
1. 生成RSA密钥对。可以使用`cryptography`库中的`generate_key_pair()`方法来生成RSA密钥对。
```python
from cryptography.hazmat.primitives.asymmetric import rsa
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
```
2. 用私钥对原始数据进行签名。可以使用`cryptography`库中的`sign()`方法来对数据进行签名。
```python
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
message = b"Hello, World!"
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
```
3. 用公钥验证签名。可以使用`cryptography`库中的`verify()`方法来验证签名是否正确。
```python
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("Signature is valid")
except InvalidSignature:
print("Signature is invalid")
```
完整的代码如下:
```python
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature
# 生成RSA密钥对
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
# 原始数据
message = b"Hello, World!"
# 使用私钥对数据进行签名
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# 使用公钥验证签名是否正确
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("Signature is valid")
except InvalidSignature:
print("Signature is invalid")
```
阅读全文