使用 OpenSSL 或 GnuPG 加密檔案與目錄,用密碼上鎖保護機密資料

使用 GnuPG 加密

GnuPG 是 GNU Private Guard 的簡寫,它是一個用來加密與解密的指令工具,支援對稱式與非對稱式加密,是 PGP 加密軟體的一個免費替代方案。

加密與解密單一檔案

GnuPG 的對稱式加密用法很簡單,只要執行 gpg 加上 -c 指令即可:

gpg -c test.cpp

加密時一樣要輸入兩次密碼:

how-to-encrypt-data-in-linux-using-gpg-and-open-ssl-2

輸入密碼

經過 GnuPG 加密的檔案,預設會儲存成一個 .gpg 檔案。若要進行解密,就執行:

gpg -o output.cpp test.cpp.gpg

這裡我們以 -o 參數指定輸出的檔案名稱,若不指定輸出檔名,則預設會使用原來的檔名(即 test.cpp)。

how-to-encrypt-data-in-linux-using-gpg-and-open-ssl-3

使用 GnuPG 加密

加密與解密目錄、多個檔案

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

參考資料:TecmintSource Dexter

Linux

3 Comments

  1. Dave

    介紹的非常易懂~

  2. Chao

    加密應該用private_key.pem。

    • lu

      非对称加密是用公钥的,签名才是使用私钥

Leave a Reply