查資料的時候發現很多人有疑惑,公鑰和私鑰到底哪個是用來加密,哪個是用來解密的,是否可以公鑰加密私鑰解密,同時也可以私鑰加密公鑰解密呢?針對這一問題,說下自己的理解。
首先要明確兩個問題:(1)既可以公鑰加密私鑰解密,也可以私鑰加密公鑰解密;(2)加密解密和簽名驗證是兩個不同的概念。
(一)先來說加密解密:需要同時使用公鑰和私鑰的加密算法是非對稱加密,最常見的便是RSA。
舉例說明非對稱加密:如果A想要給B秘密的發一條信息,只需要B創建一套公鑰(盒子)和私鑰(鑰匙),盒子可以隨意分發,但是鑰匙只能B自己所有,當A想要給B發信息時,只需要把信息(紙條)通過B的公鑰加密(放入盒子里鎖上),再由B用私鑰(鑰匙)進行解密(打開盒子),即可獲取A發送的信息。此時如果C想要截取信息,但是由於沒有B的私鑰,C即使拿到了信息也無法解密(只有盒子沒有鑰匙),從而保證了數據的安全性。
那么B是否可以通過私鑰加密信息,然后由A使用公鑰解密信息呢?從原理上講,是可以的。 非對稱密鑰是可以用於雙向加解密的。但是我們為什么不這么用呢,很好理解,因為所謂公鑰,是公開的,不只A一個人擁有,因此雖然A能夠正常讀取到信息,但是其他人也可以解密該條信息,從而無法保證信息的安全性。但是簽名驗證就不同了。
(二)簽名驗證:用私鑰進行簽名,用公鑰進行驗證,從而保證信息來源是私鑰擁有者。
舉例說明:A想要讓B確認某條信息是由自己發出的,先將自己的公鑰發送給B,然后用自己的私鑰對信息進行簽名並發送給B(比如將字符串X用A的私鑰加密生成Y,將X和Y以及信息都發送給B),B收到信息后用A的公鑰對簽名進行驗證,用A的公鑰解密Y得到Z,如果Z=X,則驗證成功,說明信息是由A發布的。
(三)最后借用百度百科的例子來說明加密和簽名的結合應用:
假如現在 Alice 向 Bob 傳送數字信息,為了保證信息傳送的保密性、真實性、完整性和不可否認性,需要對傳送的信息進行數字加密和簽名,其傳送過程為:
1.Alice 准備好要傳送的數字信息(明文);
2.Alice 對數字信息進行哈希運算,得到一個信息摘要;
3.Alice 用自己的私鑰對信息摘要進行加密得到 Alice 的數字簽名,並將其附在數字信息上;
4.Alice 隨機產生一個加密密鑰,並用此密碼對要發送的信息進行加密,形成密文;
5.Alice 用 Bob 的公鑰對剛才隨機產生的加密密鑰進行加密,將加密后的 DES 密鑰連同密文一起傳送給Bob;
6.Bob 收到 Alice 傳送來的密文和加密過的 DES 密鑰,先用自己的私鑰對加密的 DES 密鑰進行解密,得到 Alice隨機產生的加密密鑰;
7.Bob 然后用隨機密鑰對收到的密文進行解密,得到明文的數字信息,然后將隨機密鑰拋棄;
8.Bob 用 Alice 的公鑰對 Alice 的數字簽名進行解密,得到信息摘要;
9.Bob 用相同的哈希算法對收到的明文再進行一次哈希運算,得到一個新的信息摘要;
10.Bob 將收到的信息摘要和新產生的信息摘要進行比較,如果一致,說明收到的信息沒有被修改過。
(四)蘋果開發者證書配置時非對稱加密算法的應用
我們在進行IOS開發時,配置證書的過程其實也是使用了非對稱加密算法:
我們在配置證書前,需要先在MAC上通過keychain生成CSR(Certificate Signing Requese)文件,該文件包含開發者身份信息和開發者電腦的公鑰,而私鑰始終保存在MAC中,用於簽名本機對外發布的APP
接下來將該CSR文件上傳至APPLE DEVELOPER網站,蘋果會用蘋果的私鑰對其進行簽名(授權),從而生成證書
我們在進行APP打包時,會使用開發者的私鑰對應用進行簽名
同時被蘋果簽名的證書(經過蘋果私鑰簽名、並含有開發者公鑰)會包含在描述文件(Provisioning File)中,並在應用被安裝時拷貝到IOS設備中
IOS設備中含有蘋果的公鑰,可以對證書進行驗證,證明該應用得到了蘋果的授權
接下來IOS設備會通過證書中開發者的公鑰對APP的簽名進行驗證
但是我認為蘋果對於APP的簽名和驗證不止於此,因為我們之前的APP存在着一台電腦打包的IPA在另一台電腦使用同樣證書發布過IPA后就不能使用的情況。如果對簽名的驗證都是在IOS設備本地執行的,即使APPLE DEVELOPER上的證書發生了變化,也不應該影響到APP的使用。因此我認為蘋果還會在打開APP時將本地的簽名使用網站證書中的公鑰進行驗證,如果失敗則會閃退。