【RAS非對稱加密演算法】DEMO原理與示例

PythonNew_Mr.Wang發表於2024-12-05
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}")

相關文章