這里郵件加密的基本原理是非對稱的加密形式。每個人都會生成一對密鑰,分為公鑰和私鑰。正如名字所述,公鑰是公開的,而私鑰只能本人所有,私鑰和公鑰配對存在,彼此解密。實際加密郵件時,使用自己的私鑰和接收人的公鑰對郵件加密,郵件的接收人根據發送人的公鑰和接收人的私鑰進行郵件解密。根據上述原理,想要進行郵件加密的操作,我們必須要生成自己的公鑰和私鑰,並獲取接收人的公鑰。
這個操作中,使用的軟件是 thunderbird 及其插件 Enigmail,以及密鑰生成軟件Gpg4win。
根據大神的博客嘗試了加密和解密郵件的操作,感謝分享,下附博客原址。
原文鏈接: http://zhaokaifeng.com/?p=552
以下是博客原文,我在window10 上實現了操作,鏈接和使用方法均正確。
非對稱加密的原理:
最先出現的加密方法是對稱加密。在對稱加密算法中是不區分公鑰和私鑰的,加密與解密使用的都是同一個密碼。但是很顯然,如果需要對信息進行加密與解密的不是同一個人,使用對稱加密算法就存在密鑰泄露的極大可能。因此,一種非對稱加密的想法在1974年最先由Ralph C. Merkle提出。目前主要的非對稱加密算法有:RSA、EIGamal、ECC、背包算法和D-H公鑰加密算法等。
1.公鑰加密信息的工作過程:
A使用公鑰加密算法創建一個自己的公鑰A-1和私鑰A-2。私鑰A-2由A自己保管,不對外公開。公鑰A-1則通過一些可信的渠道公布出去,例如使用了HTTPS的網頁(這里之所以強調“HTTPS”是因為HTTPS協議對傳輸的信息做了加密,如果將公鑰放在使用HTTP協議的網頁上,由於HTTP是明文傳輸網頁數據的,因此在傳輸的過程中有可能因為遭遇中間人攻擊等而出現公鑰被修改的可能。前文提到“可信的渠道”也是出於此原因。)、公鑰服務器或者面對面傳遞公鑰。B在拿到A的公鑰A-1后,如果B想給A發送加密信息就可以使用公鑰A-1進行加密后再發送給A,A收到加密信息后使用自己知道的,與公鑰A-1對應的私鑰A-2解密B發來的加密信息。
上述信息加密過程的一個應用就是本文接下來要介紹的發送使用公鑰加密的電子郵件並用對應的私鑰解密該郵件。公鑰加密算法還有一個應用就是用於身份認證,即數字簽名技術。
2.數字簽名的工作過程:
傳統的簽名可以通過簽字人筆跡的唯一性確定信息的所有者。在計算機系統中,我們使用公鑰加密算法進行數字簽名。首先,仍然是生成一對公鑰和私鑰,公鑰公布,私鑰私有,但是這一次私鑰不是用來解密的,而是用於加密的。由於私鑰的與公鑰具有數學上的關聯性(雖然公鑰與私鑰具有相關性,但是使用目前主流的非對稱加密算法並且在密鑰長度足夠復雜的情況下還沒有找到破解這種關聯性的有效的方法。2018年02月10日注),即一個公鑰只對應一個私鑰,只要一份文件可以通過一個公鑰解密,那么在一般情況這份文件就是由這個公鑰所對應的私鑰的持有者加密的。這樣就可以進行身份認證。
總結一下:
信息加密中,公鑰加密,私鑰解密;
數字簽名中,私鑰加密,公鑰解密;
無論信息加密還是數字簽名都是:公鑰公開,私鑰保密。
前期准備:
- 下載和安裝Thunderbird。
Thunderbird下載地址:https://www.mozilla.org/en-US/thunderbird/
-
- 在Thunderbird上登陸一個電子郵件帳號。
- 如果想對電子郵件加密技術有一個大致的了解,可以參考我的這篇博文:電子郵件加密技術初探
本文要用到的工具的介紹:
1.Thunderbird
這是一個郵件客戶端,有很多插件可以使用,支持Windows、Linux和macOS.
2.GPG
GPG即GnuPG,是由自由軟件基金會Free Software Foundation 開發的用於替代商業軟件PGP的一款免費軟件,可以用來加密數據以及進行數字簽名。PGP中使用了具有專利的算法,不能免費使用,而GPG中則沒有使用具有專利的算法,可以免費使用。
3.Enigmail
Enigmail是Thunderbird的一個插件,可以對將要發送的郵件進行GPG公鑰加密或對收到的使用GPG加密的郵件進行解密。
發送公鑰加密的電子郵件的過程如下:
1.下載安裝GPG並創建密鑰對
GPG官網下載地址:https://www.gnupg.org/download/index.html
或者也可以使用Gpg4win,Gpg4win官網:https://www.gpg4win.org/index.html
本文中使用的是Gpg4win.
Gpg4win安裝完成后在默認情況下會打開Kleopatra,點擊“創建密鑰對”。
輸入名字和郵箱,依次點擊:下一步–>創建
創建的過程中會要求設置一個密碼以保護將要生成的私鑰,這樣可以防止私鑰被越權使用。
稍等一會我們就可以看到“密鑰對已成功創建”的窗口提示。在該窗口里我們還可以看到密鑰指紋(密鑰指紋可以用來驗證密鑰在傳輸的過程中是否被修改。指紋的另一個重要用途就是,由於公鑰服務器並不會對上傳的公鑰進行身份驗證,因此任何人都可以以你的名義上傳公鑰,為了防止這種情況發生,你可以在你的個人主頁上公布自己的密鑰指紋,以提供給下載了你的公鑰的人用於驗證公鑰的真偽。)以及“生成您的密鑰對副本”、“通過電子郵件發送公鑰”和“將公鑰上傳到目錄服務”(如果將公鑰上傳到了公鑰服務器,不同的公鑰服務器之間會相互交換公鑰,最終你上傳到一台公鑰服務器上的公鑰會遍布全網所有公鑰服務器。之后,任何人都可通過該公鑰對應的電子郵件地址或者密鑰ID查找對應的公鑰,從而向我們發送加密信息)這三個選項。
密鑰對創建完成后,我們可以在Kleopatra中看到剛才創建的項目,選中該項目可以導出“.asc”格式的公鑰,右鍵可以進行“更改到期日期”等更多操作。
2.在Thunderbird中搜索安裝插件Enigmail並配置密鑰文件
關於在Thunderbird中安裝插件的步驟,可以參考我的這篇文章Windows上設置Mozilla Thunderbird郵件客戶端后台運行。
打開Thunderbird的設置,依次找到Enigmail->Key Management->File->Import Keys from File 可以導入某個郵箱地址的公鑰文件或者在搜索框中通過輸入郵箱地址或密鑰ID在公鑰服務器上搜索對應的公鑰。如果已使用GPG創建密鑰對的電子郵件地址已經登陸了Thunderbird可以直接在Key Management里看到相關信息,不需要進行密鑰文件配置。
安裝Enigmail后,如果我們的Thunderbird上的一個郵箱賬戶沒有設置GPG公鑰,當我們使用該賬戶發信時就會彈出如下的警報:
- The key ID 'XXX@XXX.XXX' configured for the current identity does not yield a usable OpenPGP key.
- Please ensure that you have a valid, not expired OpenPGP key and that your account settings point to that key.
- If your key is not expired, then check if you did set Owner trust to full or ultimate
這種情況下,除非對該賬號設置GPG公鑰或者卸載Enigmail,否則就無法在發送郵件時解除該警報,也無法在Thunderbird上使用該賬號發送郵件。
3.發送加密電子郵件
假設我們需要向AAA@AAA.AAA這個電子郵件地址發送GPG加密郵件,首先應該使用第二步介紹的方法導入AAA@AAA.AAA對應的公鑰文件(該文件將用於加密郵件),或者通過郵件地址AAA@AAA.AAA或對方的密鑰ID在公鑰服務器上搜索其公鑰,搜索到的公鑰需要進行指紋驗證以確保該公鑰不是偽造的。
當我們第一次使用一個已經設置GPG公鑰的電子郵件地址向另外一個具有GPG公鑰的電子郵件地址發送郵件時會彈出確認提示:
- You did not yet configure Enigmail security for the selected identity. Do you want to do this now?
點擊Configure ,選中Enable OpenPGP support (Enigmail) for this identity ,點擊OK .之后會彈出窗口詢問我們是想使用GPG進行加密還是進行身份認證以及使用哪種GPG加密方式:
- Enigmail Encryption & Signing Settings
- Encrypt Message
- Sign Message
- Use Inline PGP
- Use PGP/MIME
這里我們選擇Encrypt Message 和Use PGP/MIME ,點擊OK .
在發送郵件之前,我們可以通過點擊工具欄上的小鎖在加密與不加密之間切換。
4.解密收到的加密電子郵件
假設我們的一個郵箱地址BBB@BBB.BBB接收到一封GPG加密的電子郵件(該郵件使用的是BBB@BBB.BBB的公鑰進行的加密),那么,我們就可以在安裝有GPG軟件的電腦上(且該電腦上存儲有BBB@BBB.BBB的私鑰)使用郵件客戶端,通過輸入BBB@BBB.BBB的私鑰加密密碼的方式解密該郵件。在網頁端登陸郵箱,需要配合插件來解密GPG加密的郵件。
注1:前面設置密鑰對時設置的密碼並不是私鑰,而是加密私鑰的密碼,僅僅使用該密碼是不可以解密郵件的,必須配合私鑰文件一起才能解密。
注2:GPG加密的郵件並不會加密郵件地址和標題。
