使用 GnuPG 加密
GnuPG 是 GNU Private Guard 的簡寫,它是一個用來加密與解密的指令工具,支援對稱式與非對稱式加密,是 PGP 加密軟體的一個免費替代方案。
加密與解密單一檔案
GnuPG 的對稱式加密用法很簡單,只要執行 gpg
加上 -c
指令即可:
gpg -c test.cpp
加密時一樣要輸入兩次密碼:
經過 GnuPG 加密的檔案,預設會儲存成一個 .gpg
檔案。若要進行解密,就執行:
gpg -o output.cpp test.cpp.gpg
這裡我們以 -o
參數指定輸出的檔案名稱,若不指定輸出檔名,則預設會使用原來的檔名(即 test.cpp
)。
加密與解密目錄、多個檔案
GnuPG 一樣可配合 tar
對整個目錄加密:
tar czf - my_folder | gpg -c -o secured.tgz.gpg
解密則執行:
gpg -o - secured.tgz.gpg | tar xz
多檔案的狀況也是使用類似的方法:
tar -czf - * | gpg -c -o secured.tgz.gpg
將多個檔案解密至 output_folder
:
mkdir output_folder gpg -o - secured.tgz.gpg | tar xz -C output_folder
非對稱式加密
建立加解密用的金鑰:
gpg --gen-key
執行之後,要選擇金鑰的類型:
gpg (GnuPG/MacGPG2) 2.0.30; Copyright (C) 2015 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection?
這裡選擇第一個預設的 RSA and RSA
即可,接著要選擇金鑰長度,長度越長越安全,通常使用預設值 2048
即可:
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048)
設定金鑰的使用期限:
Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0)
如果設定為 0
則代表金鑰沒有使用期限,可以永久使用。
確認資訊正確之後,輸入姓名與 Email 信箱:
Is this correct? (y/N) y GnuPG needs to construct a user ID to identify your key. Real name: G.T.Wang Email address: guozhao.wang@gmail.com Comment: You selected this USER-ID: "G.T.Wang <guozhao.wang@gmail.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
確認無誤之後,應該還會要求使用者設定金鑰的密碼(要輸入兩次),接著就會開始產生金鑰,在金鑰的產生過程中,系統會需一些亂數的資訊來源,如果發現它在這裡很久,就隨便動動滑鼠、用鍵盤打一些字,或是做一些開檔存檔等動作,可以讓產生金鑰的過程加快一些。
We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. gpg: key F1165B09 marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u gpg: next trustdb check due at 2018-08-19 pub 2048R/F1165B09 2016-09-13 Key fingerprint = 9A78 21DD C3B3 E193 850A 16F9 7E44 AD5F F116 5B09 uid [ultimate] G.T.Wang <guozhao.wang@gmail.com> sub 2048R/2A9C22A3 2016-09-13
金鑰建立好之後,可將公鑰匯出,並將公鑰散佈出去,讓所有需要加密傳送檔案給你的人使用:
gpg --armor --output pubkey.txt --export 'G.T.Wang'
另外也建議同時將私鑰匯出,備份在安全的地方,以防萬一:
gpg --armor --output privkey.txt --export-secret-keys 'G.T.Wang'
加密資料時只需要使用公鑰,通常如果是要傳送加密資料給別人的時候,要先取得對方的公鑰,將公鑰匯入 GnuPG 之後,使用對方的公鑰來對資料進行加密。匯入金鑰的方式為:
gpg --import pubkey.txt
有了對方的公鑰之後,就可以把資料加密後再傳給對方解密。
GnuPG 加密資料的方式跟 OpenSSL 類似,其使用 hybrid ciphers 的方式,以一組隨機產生的 session key 加密資料,再將這個 session key 透過非對稱式加密後,再連同加密的資料一起傳送給對方,詳細的說明請參考 GnuPG 的說明文件。
這裡我只示範自己寄給自己的情況:
gpg --encrypt --recipient 'G.T.Wang' test.txt
這裡的 --recipient
是指定收件人,也就是要用誰的公要來加密的意思,加密過後的檔案就只有擁有該私鑰的人可以解密。
如果在 GnuPG 中有對應的私鑰,就可以使用這個指令進行解密:
gpg --output test.txt --decrypt test.txt.gpg
若要列出目前 GnuPG 系統中含有的公鑰列表,可以使用:
gpg --list-keys
/Users/seal/.gnupg/pubring.gpg ------------------------------ pub 2048D/00D026C4 2010-08-19 [expires: 2018-08-19] uid [ultimate] GPGTools Team <team@gpgtools.org> uid [ultimate] GPGMail Project Team (Official OpenPGP Key) <gpgmail-devel@lists.gpgmail.org> uid [ultimate] GPGTools Project Team (Official OpenPGP Key) <gpgtools-org@lists.gpgtools.org> uid [ultimate] [jpeg image of size 5871] sub 2048g/DBCBE671 2010-08-19 [expires: 2018-08-19] sub 4096R/0D9E43F5 2014-04-08 [expires: 2024-01-02] pub 8192R/347DC10D 2013-06-29 uid [ unknown] Warren Togami (2013) <wtogami@gmail.com> sub 8192R/668709D4 2013-06-29 pub 2048R/F1165B09 2016-09-13 uid [ultimate] G.T.Wang <guozhao.wang@gmail.com> sub 2048R/2A9C22A3 2016-09-13
若要列出私鑰列表,則使用:
gpg --list-secret-keys
/Users/seal/.gnupg/secring.gpg ------------------------------ sec 2048R/F1165B09 2016-09-13 uid G.T.Wang <guozhao.wang@gmail.com> ssb 2048R/2A9C22A3 2016-09-13
參考資料:Tecmint、Source Dexter
繼續閱讀: 12
Dave
介紹的非常易懂~
Chao
加密應該用private_key.pem。
lu
非对称加密是用公钥的,签名才是使用私钥