如何傳輸只有收件者才能開啟的私密文件 — GunPG 應用

Nick
8 min readAug 24, 2021

--

前言

最近換了新工作,初始做要許多開發環境設定,當中包含有些要 access 系統的密碼要設定,在跟同事索取密碼之前呢,有先請我設定好 GPG key 後才會把這些密碼用加密的方式傳輸給我,覺得這過程蠻有趣的想藉此機會好好研究並記錄下來,所以這次的議題我命名為

如何傳輸只有收件者才能開啟的私密文件

以下分享說明想比較專注在說明 GPG 加密操作應用,原理會講得少一點

簡介

What: GunPG 及 OpenPGP

OpenPGP:

  • PGP 全名為 Pretty Good Privacy,原本是一個商業工具來變成衍生 OpenPGP 成一個資料加解密標準(RFC 4880),把許多密碼學會用到演算法做一個集中應用,如雜湊資料壓縮對稱金鑰加密,以及公鑰加密
  • GunPG 是一個開源軟體,是依據 OpenPGP 實作出的,讓大家可以直接不需付費就可以使用!
p.s. 講個有趣的是因為 GunPG 縮寫是 GPG 一開始很容易跟 PGP 記錯,然後一直下錯導致 command not defined 的錯誤,蠻白癡的。

PGP 加密標準在首先會需要先對使用者產生鑰匙對及配對 user 資料

  1. 一個公鑰 public key
  2. 一個私鑰 private key
  3. 綁定一位使用者 id 或 email

介紹「公鑰 public key」及「私鑰 private key」的功用

公鑰是可以公開給所有人的鑰匙,所以每個人都可以知道別人的公鑰內容是什麼,而私鑰就需要自己妥善保存。

運用上「公鑰」與「私鑰」都能對資料加密及解密,唯獨「方向」不同而且只能單向!舉個例子,以下以「卡準」模擬當前文件,如果卡準能直接通過代表文件是「未加密狀態」,擁有此文件的人可以直接閱讀內容!

無任何加密情況,文件可以直接閱讀(卡準可以直接通過來示意)

如果使用「公鑰作動」,那麼卡準「文件」將會被 +1 變成「加密文件」

文件被「公鑰作動」所以變成 +1,此時文章變成加密狀態(因無法直接被開啟閱讀)

這情況下如果多次使用「公鑰作動」幾次,會如下圖,「公鑰作動」會讓文件一直保持在「加密狀態」,因為會越來越無法回到 0 的無加密狀態。

因「公鑰作動」都只能會文件 + 1,所以只能單向的讓文件持續加密(並非文件會變大)

這時唯獨使用「私鑰作動」才能讓被「公鑰作動」的「加密文件」恢復成「未加密狀態」,以加減法舉例,只有私鑰才能做 -1 的動作。

文件應為被「私鑰作動」所以從 +1 變回 0,此時文章變回無加密狀態(卡準可以直接通過)

「加密傳輸」的應用

情境介紹

假設今天 A 有一個私密文件要傳給 B,如何確保傳遞過程中如果被其他人看到卻不會被洩漏呢?

  1. A 先產生自己的鑰匙「公鑰跟私鑰」
  2. A 提供給 B 自己的「公鑰」
  3. B 將「文件」透過 A 的公鑰進行「作動」而變成「加密文件」
  4. B 將「加密文件」傳給 A
  5. A 將「加密文件」透過自己的「私鑰作動」而「解密」取得「文件」

實際操作 GPG 加密

  1. A 先產生自己的「公私鑰」:
1. 使用 GPG 產生自己的鑰匙

安裝 GunPG:https://gnupg.org/

mac 用戶可以直接用 Homebrew 下載

brew install gnupg

建立公私鑰

gpg --full-generate-key

流程會有

  1. 選擇金鑰類型,可以選 RSA and RSA
  2. 長度設定:4096
  3. 期限:簡單設定成 0
  4. 後面就需要綁定使用者的 name 及 email

完成後會出現下圖

可以用以下兩個指令匯出公鑰及私鑰,請填入自己的 email 在尾端 <email>

2. 將自己的公鑰給別人(可以用以下指令匯出公鑰)

2. 將自己產生的 GPG key (public key) 傳給對方
gpg --output public.asc --armor --export <email>

公鑰會儲存成 public.asc,內容長的像是以下這樣,可以把這個公鑰檔案直接傳給有需要傳給你「加密文件」的對象

p.s. 會發現這邊寫的是 PGP 這個 keyword,呼應到一開始提的 GPG 這個工具是實作 OpenPGP 的格式。

-----BEGIN PGP PUBLIC KEY BLOCK-----mQINBGEh7X8BEADpmVn5CWf2VsR9v3tMwbqhW4HUml6achmRfdLRNao9ggjaTDxM
HPodzhp/sxe/DxsLa5g9KqAo35noCBn4LMDacnAv1JrP8MDzomLaeSAJPjQ8iaxf
EmJAl3YdbNNihleS6sAhOUekPw26cQvnwRoTiitFguXD+HscVDWNDGKP8YJaoBNG
GCKkqBm6tg8tkJfsKbt2GOhBPMWg5fbv4yWDUkzGiIqiOWwNfd2toaCGq5yGPVk0
.... skip
-----END PGP PUBLIC KEY BLOCK-----

3. 別人如何透過「你的公鑰」加密「他的文件」呢

3. 別人如何使用透過你的 GPG key 加密他的文件呢
加密文件的示意圖

先建立一個測試用文件

echo "secret: hello-secret" > plaintext.txt

請別人把「你的公鑰」加入他自己的公鑰清單中

gpg --import public.asc
因為我是加入自己的,加入別人的就會有成功訊息

加入後會看到這組公鑰所綁定的 user id 跟 user email,這在下面加密時會用得到,透過以下指令可以針對想要加密的文件透過要傳遞的地方進行加密

gpg --encrypt --armor -r <send-to-email> <path-to-file>
針對 secret.txt 文件透過 nick.chen.sudo@gmail.com 的公鑰進行加密

4. 請別人把「加密後的文件」傳給你,這個文件只有擁有私鑰的你可以解開如果外流也不會有問題的。

5. 解密文件

5. 透過自己的私鑰解密「用自己公鑰」加密的文件
解密文件的示意圖
gpg --decrypt secret.txt.asc
解密成功,看到原本文件內容

小結

如何傳輸只有收件者才能開啟的私密文件

今天這個問題,使用 GPG 工具的回答就是

透過收件者的公鑰加密的文件,只有收件者自己的私鑰才能解密,就算加密文件外頭也不會有事

在之前聽到「對稱加密」應用都在 ssh 授權或 https 的配置會使用到,沒想到也可以這麼 ‘生活化一點’ 的使用,但同時今天分享的也是蠻粗糙的,以下提出兩個潛在的問題,大家有興趣可以想想,解決方法我也還在研究中,如果有想法的人歡迎討論 ~

  1. 如果每次都要傳遞公鑰給對方加密,如果我不是本人那傳一個假的公鑰怎麼辦?
  2. 今天介紹的「加解密」操作流程其實非常 “工程師”,有沒有可能讓這個過程更平宜近人一點?
  3. GPG 工具是否還有其他功用?

小 murmur

相隔前一篇文章已經是一年前了,這段時間有幾次想嘗試繼續寫文章但又寫到一半作罷,總覺得自己對新事物瞭解不夠深沒資格寫文章,或自己很不足需要先趕快學習沒時間寫文章的循環中。

回頭想想發現自己忘記了最開始寫文章的目的,就只是想好好紀錄自己發現有趣事物的一面,透過這個過程累積跟反而結果通常才能更深入瞭解一個領域或工具的細節,所以想從小的東西慢慢重拾 ~

如果喜歡我這篇文,可以幫我拍手 1-10 下
如果覺得這文章對你有幫助,可以幫我拍手 10–30
如果對於這類篇小知識、小筆記感興趣,可以幫我拍手 30–50
也記得 Follow 我 陳建宇 才不會錯過新文章哦
歡迎在下方留言,我很樂意與你討論聊天或回答問題!

參考資料

--

--

Nick
Nick

Written by Nick

嗨 我是 Nick,目前在 ShopBack 擔任軟體工程師,喜歡用科技解決問題,偶爾會整理一些工作上的發現分享在這,歡迎大家追蹤及交流