GPG -- 加解密及簽章
CeontOS 7 有內建 OpenPGP 工具 gpg2,可以方便在系統中進行檔案加密,下面寫一寫該怎麼操作
密鑰製作與加密檔案流程
1. 產生密鑰
gpg2 --gen-key
第一步,會要求使用者選擇加密方式,要多長的加密,存活天數
第二步,打入個人資料,名子、emai、詢問是否加入密碼,通常會要求一定要打密碼
補充1:在完成第二步時,系統要求動動滑鼠、鍵盤,以產生其他雜湊的資料,他必需使用X介面才能正常取得
補充2:當建立好了,該使用者的路徑下,會多出一個 .gnupg 資料匣,這裡包含了pubring.gpg、secring.gpg、這兩個就是公鑰及密鑰,在匯出後才看的到資訊
補充3:如果無安裝Xwin 要生成key,則必需自行安裝 rng-tools 工具,並在生成金鑰前,打入 rngd -r /dev/urandom,產生裝置,即可。第二次再登入時,就不用打指令了
補充4:如果不加入密碼,就保留空白,PGP 會跳出警告,建議建立8碼的密碼,確定不建立,就 Take this one anyway 兩次,之後會再要求 re-enter,OK 後就產生了
2. 匯出公錀
gpg2 --export -a > public.key
出現一段加密後的公鑰資料,使用 ASCII,比較容易看的資料
gpg2 --export > public.key
出現了一段加密的 public.key,使用 binary OpenPGP format,看不出內容的
gpg2 -r [金鑰] --export -a > public.key
匯出指定公鑰,並使用 ASCII
註:公錀是用來提供給寄件者使用的,寄件者匯入收件者公鑰後,進行加密
3. 匯出密鑰
gpg2 --export-secret-key -a > public_secret.key
這個也是可以提供給寄件者使用的,寄件者必需匯入密鑰後,才能解開經過收件者公鑰加密的檔案
4. 加密檔案
gpg2 --encrypt test.txt
加密後,會出現一個 test.txt.gpg 檔
gpg2 -e test.txt
gpg2 -e -c test.txt <== 用了 -c 會再加入一個密碼
gpg2 -e -a test.txt <== 使用 ascii 格式,檔名會變成 .asc
gpg2 -r [金鑰] -e test.txt <== 指定使用金鑰,直接加密檔案(這時系統就不會跳出金鑰詢問)
gpg2 -r [金鑰] -e test.txt --yes <== 如果檔案存在,就直接蓋過去
gpg2 -o [路徑/檔名] -e test.txt <== 指定加密檔案存放路徑及名稱
補充:當寄件人只匯入收件人的公鑰時,在加密過程,GPG 會告知寄件人,“這金鑰並非該ID 的,如果您知道您在做什麼,請回答 yes”,加密後,寄件人是無法解密的,除非寄件者有匯入收件者的密鑰,如果要跳過詢問的流程,需簽署本機金鑰後,GPG 才不會過問
公鑰、密鑰匯入與解開加密檔流程
1. 取得公、密鑰
這個需由製造者提供
2. 匯入公、密鑰
gpg2 --import public.key
gpg2 --import public_secret.key
一定要匯入兩組,不然,就解不開了
補充1:如果是單向解密,寄件人只需要有 public.key,即可進行加密,但寄件人是解不開的,如果是要雙向解密,有兩種方式。1. 雙方皆產生公鑰交換(標準方式)。2. 收件人提供寄件人公、密鑰
補充2:匯入私鑰時,就會自動產生公鑰
3. 檔案解密
gpg2 --decrypt test.txt.gpg
gpg2 -d test.txt.gpg
註:純文字解開後,就是直接在下面顯示檔案內容
gpg2 -d test.txt.gpg > test.txt
註:如果要輸出成指定格式,就用 > *.附檔名
補充:如果使用這個匯入的公、密鑰再來加密檔案是否可以呢?可以,不過,系統會提示,這不是本用戶的密鑰,但仍可以使用
常用語法
列出公鑰
gpg2 --list-keys
gpg2 -k
列出密鑰
gpg2 --list-secret-keys
gpg2 -K
gpg2 --check-signs <== 列出 key 及簽署。一般只會出現自己的,如果有其他的簽署,會列出來
gpg2 --delete-key "[金鑰UID]" <== 完全刪除指定公鑰
gpg2 --delete-secret-key "[金鑰UID]" <== 刪除指定密鑰
補充:如果要刪除金鑰,在同時有密鑰的情形下,必需先刪除密鑰後,才能刪除公鑰
gpg2 --passwd "[金鑰UID]" <== 變更密碼。如要設為空值,就不要打新密碼
gpg2 --fingerprint "[金鑰UID]" <== 列出指紋碼。如不打 UID,則全部列出。指紋碼用於確認檔案是否被竄改
gpg2 --sign-key "[金鑰UID]" <== 為其他公鑰使用本機金鑰簽署。
gpg2 --lsign-key "[金鑰UID]" <== 為其他公鑰使用本機金鑰簽署,並標記為不可匯出(non-exportable)
註1:當經過簽署後,在使用該公鑰加密時,GPG 不會再問是否確認不明公鑰加密
註2:在 --edit-key 中,可以看到 validity 改為 full
註3:要刪除金鑰簽署,必需到 --edit-key 中
註4:寄件者進行本機簽署後,並不會影響收件者解密,不過寄件者仍無法解密透過收件者公鑰加密的檔案
註5:即使使用 --delete-key,再重新匯入公鑰時,簽署的資訊仍會存在
指定加密檔存放位置(o),指定金鑰(r),指定加密檔案(e)
gpg2 -o /home/towns/gpg/test.txt.gpg -r "test" -e /home/towns/test.txt
金鑰伺服器相關
--send-keys
--recv-keys
--search-keys
--refresh-keys
--server
晶片卡相關
--card-status
--card-edit
--change-pin
互動式管理金鑰
gpg2 --edit-key "[金鑰UID]" <== 指定金鑰,進入互動式畫面
quit <== 離開互動介面
save <== 存檔並離開互動介面
註:當執行 sign、trust、revoke 指令,這時會變更金鑰的內容,就必需存檔
fpr <== 顯示指紋資料
簽署本機金鑰。這個動作會將本機的密鑰寫入該公鑰中,這時在進行加密時,GPG 將不再提示此為不明金鑰
sign <== 簽署本機金鑰
lsign <== 簽署本機金鑰,該金鑰不能匯出
nrsign <== 簽署本機金鑰,該金鑰不能撤銷、廢除
註:簽署後,必需 save 離開,否則在 list 資訊時,仍會出現 unknown,且會無法刪除簽署
刪除簽署
list <== 列出目前金鑰資訊
uid 1 <== 選擇金鑰 ID 編號
註1:UID 編號會出現在 sub 之下,一般只會看到一個
註2:取消選擇,就再打一次
註3:在未經過其他簽署時(如本機金鑰簽署),在trust、validity及 UID 1,都會出現unknown
delsig <== 刪除簽署資訊
註1:如果沒有簽署本機金鑰,就只會出現本身的簽署資訊
註2:如果有答署本機金鑰,在刪除時,會出現提示,詢問是否刪除本身簽署、外加簽署說明
save <== 存檔離開
刪除金鑰
list <== 列出目前金鑰資訊
key 1 <== 選擇金鑰編號
delkey <== 刪除金鑰
save <== 存檔離開
註1:一但刪除金鑰,該 key 將無法再加密檔案
註2:如果要完全刪除需使用gpg2 --delete-key "[金鑰UID]"
其他指令
/usr/bin/gpg-agent
/usr/bin/gpg-connect-agent
/usr/bin/gpg-zip
/usr/bin/gpg2
/usr/bin/gpgconfig
/usr/bin/gpgparsemail
/usr/bin/gpgsplit
/usr/bin/gpgv2
參考資料:
小雨大口述
stackoverflow 討論 -- Xen2050 大的回應
http://stackoverflow.com/questions/28321712/gpg-decryption-fails-with-no-secret-key-error
stackoverflow 討論 --Danny Staple 大的回應 -- RNG
http://serverfault.com/questions/214605/gpg-not-enough-entropy
DEK(data-encrypting key)與 KEK(key-encrypting key)
這是同一件事情
留言
張貼留言