非對稱式加密 - 使用RSA演算法完成加解密 (1)

非對稱式加密 - 使用RSA演算法完成加解密 (2)

非對稱式加密 - 使用RSA演算法完成加解密 (3)

Alice想傳送訊息給Bob,但Bob尚未擁有公鑰、私鑰。
第一步(接收方視角):Bob 產生公鑰及私鑰,並將公鑰發布於公開的網際網路中。
金鑰長度越長,越可以減少被破解的機會,典型的 RSA 金鑰大小為 1,024 或 2,048 或 4,096 位元。
美國國家標準暨技術研究院(NIST)建議,RSA金鑰長度至少為2048位元。
試試看
1. 請選擇任一金鑰長度:  bits。
2. 分別將兩塊程式碼拼圖拖曳至正確的虛框中,作答完畢後按下「執行程式」。
Bob寫程式產生公私鑰
實際上可以藉由軟體操作產生公私鑰,省去親手寫程式的步驟。

from Crypto.PublicKey import RSA
# 產生 1024、2048 位元 RSA 金鑰
key = RSA.generate()

產生Bob

產生Bob
# 看看印出的公私鑰,和.pem檔案中的內容是否一樣
print('private.pem檔案中的內容為:\n', privateKey.decode('utf-8'))
print('\npublic.pem檔案中的內容為:\n', publicKey.decode('utf-8'))
 
拖曳區:程式碼拼圖
privateKey = key.export_key()
with open("private.pem", "wb") as f:
        f.write(privateKey)
publicKey = key.publickey().export_key()
with open("public.pem", "wb") as f:
        f.write(publicKey)
Bob的電腦
產生兩個金鑰檔
執行結果:除了印出檔案內容外,Bob的本機端會產生private.pem、public.pem 兩個檔案。
(金鑰長度若設定為 2048 位元,需較長的程式執行時間)

第二步(接收方視角):Bob 將金鑰發布於公開的網際網路中。
咦?現在Bob有公鑰及私鑰,他要發布哪份金鑰檔呢?
在此以「雲朵」表示公開的網際網路,請將正確的金鑰檔拖曳至雲朵中央,表示發布至公開網際網路。
Bob要將哪份金鑰檔發布於公開的網際網路中呢?
 
拖曳區:Bob目前擁有的金鑰檔