from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
# 生成 RSA 金鑰對
def generate_rsa_keys():
"""
公鑰是透過特定演算法從私鑰匯出的,可以安全地公開。
公鑰用於加密資料或驗證簽名。
私鑰用於解密資料或生成簽名。
"""
key = RSA.generate(2048) # 生成 2048 位的 RSA 金鑰
private_key = key.export_key() # 匯出私鑰
public_key = key.publickey().export_key() # 匯出公鑰
return private_key, public_key
# 加密
def encrypt_message(message, public_key):
"""
在加密時,公鑰用於將明文資訊轉換為密文,只有與公鑰對應的私鑰才能解密密文。
使用加密演算法(如 PKCS1_OAEP)對明文進行加密,自動處理填充和轉換為密文。
"""
public_key = RSA.import_key(public_key) # 匯入公鑰
cipher = PKCS1_OAEP.new(public_key) # 使用 PKCS1_OAEP 進行加密
encrypted_message = cipher.encrypt(message.encode('utf-8'))
return encrypted_message
# 解密
def decrypt_message(encrypted_message, private_key):
"""
解密過程涉及使用私鑰對透過公鑰加密的密文進行還原。私鑰與公鑰在 RSA 加密過程中有明確的數學關係,確保只有私鑰能解密由公鑰加密的資料。
"""
private_key = RSA.import_key(private_key) # 匯入私鑰
cipher = PKCS1_OAEP.new(private_key) # 使用 PKCS1_OAEP 進行解密
decrypted_message = cipher.decrypt(encrypted_message).decode('utf-8')
return decrypted_message
# 測試
if __name__ == "__main__":
# 生成金鑰
private_key, public_key = generate_rsa_keys()
print("私鑰:")
print(private_key.decode())
print("公鑰:")
print(public_key.decode())
# 加密和解密
message = "Hello, PyCryptodome!"
print(f"\n原始訊息: {message}")
encrypted = encrypt_message(message, public_key)
print(f"加密後的訊息: {encrypted}")
decrypted = decrypt_message(encrypted, private_key)
print(f"解密後的訊息: {decrypted}")