生成python基于RSA的非对称数字签名
时间: 2023-07-04 07:27:34 浏览: 95
下面是一个基于RSA的数字签名的Python示例代码,使用了pycryptodome库:
```python
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
# 生成RSA密钥对
key = RSA.generate(2048)
# 原始数据
data = b'This is a test message.'
# 对数据进行哈希
hash_obj = SHA256.new(data)
# 使用私钥对哈希值进行签名
signature = pkcs1_15.new(key).sign(hash_obj)
# 将签名和原始数据一起发送给接收方
# 接收方使用公钥对签名进行验证
hash_obj = SHA256.new(data)
try:
pkcs1_15.new(key.publickey()).verify(hash_obj, signature)
print("Signature is valid.")
except (ValueError, TypeError):
print("Signature is invalid.")
```
这个示例代码生成了一个2048位的RSA密钥对,对一个消息进行哈希,并使用私钥对哈希值进行签名。然后,使用公钥对签名进行验证,如果验证通过,则说明签名是有效的。
相关问题
生成python基于RSA的非对称数字签名,认证信息为任意可输入数字
下面是一个基于RSA的数字签名的Python示例代码,使用了pycryptodome库,认证信息为任意可输入数字:
```python
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
# 生成RSA密钥对
key = RSA.generate(2048)
# 获取认证信息
auth_info = input("请输入认证信息:").encode('utf-8')
# 对认证信息进行哈希
hash_obj = SHA256.new(auth_info)
# 使用私钥对哈希值进行签名
signature = pkcs1_15.new(key).sign(hash_obj)
# 将签名和认证信息一起发送给接收方
# 接收方获取认证信息和签名
auth_info = input("请输入认证信息:").encode('utf-8')
signature = input("请输入签名:").encode('utf-8')
# 对认证信息进行哈希
hash_obj = SHA256.new(auth_info)
# 使用公钥对签名进行验证
try:
pkcs1_15.new(key.publickey()).verify(hash_obj, signature)
print("Signature is valid.")
except (ValueError, TypeError):
print("Signature is invalid.")
```
这个示例代码生成了一个2048位的RSA密钥对,获取输入的认证信息,并对认证信息进行哈希。然后,使用私钥对哈希值进行签名。接着,将签名和认证信息一起发送给接收方。
接收方获取输入的认证信息和签名,并对认证信息进行哈希。最后,使用公钥对签名进行验证,如果验证通过,则说明签名是有效的。
python基于RSA的非对称数字签名
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")
```
阅读全文