要在Python中使用公钥加密算法进行加解密和数字签名,我们可以使用cryptography
库。这个库提供了一系列密码学工具和原语。首先,确保你安装了cryptography
库。如果还没有安装,可以通过pip安装:
pip install cryptography
下面是一个使用cryptography
库进行加密、解密和数字签名的示例:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
# 生成密钥对
def generate_keys():
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
return private_key, public_key
# 加密
def encrypt(message, public_key):
encrypted = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return encrypted
# 解密
def decrypt(encrypted, private_key):
original_message = private_key.decrypt(
encrypted,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return original_message
# 签名
def sign(message, private_key):
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return signature
# 验证签名
def verify(signature, message, public_key):
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return True
except:
return False
# 使用示例
private_key, public_key = generate_keys()
# 加解密示例
message = b"Hello, World!"
encrypted_msg = encrypt(message, public_key)
print("Encrypted:", encrypted_msg)
decrypted_msg = decrypt(encrypted_msg, private_key)
print("Decrypted:", decrypted_msg)
# 签名和验证示例
signature = sign(message, private_key)
print("Signature:", signature)
verification = verify(signature, message, public_key)
print("Verification:", verification)
这段代码首先生成一个RSA密钥对,然后使用公钥加密一条消息并用私钥解密。接着,它用私钥对消息进行签名,并使用公钥验证这个签名。如果verify
函数返回True
,表示签名验证成功;如果返回False
,表示验证失败。