###### tags: `Security` `Algorithm` `演算法圖鑑` # 安全性演算法 ## 共用金鑰密碼系統 這是一種加密、解密都使用相同金鑰的加密演算法,又稱為對稱式加密 優點是對稱加密的速度比非對稱加密快很多 但要求雙方取得相同的密鑰是對稱密鑰加密的主要缺點 :::info 共用金鑰密碼系統的密碼包含凱薩密碼、AES (進階加密標準)、DES (資料加密標準) 一次性密碼本 (one-time pad)等,現在廣泛使用 AES ::: ### 原理概述 A 想傳送資料給 B,但怕 C 會竊取資料 因此 A 用金鑰加密資料,傳送給 B,因為 C 沒有金鑰,所以無法得到資料 ```sequence Note over A: 金鑰加密資料 participant C A --> B: 傳送密文 Note over C: 竊取密文\n但沒有金鑰打不開 Note over B: 金鑰解密密文\n獲得資料 ``` ### 問題點 如果 A 與 B 沒有直接的往來,A 想透過網路傳送金鑰 這時候金鑰有可能會被 C 竊取,因此 C 也可以得到資料 如果對金鑰加密再次傳送,又會遇到一樣的問題 這種需要安全傳送金鑰的問題,被稱為<font color=Tomato>金鑰傳送困難</font>問題 解決辦法包含 : 使用金鑰交換協定、使用公開金鑰密碼系統 ## 公開金鑰密碼系統 這是一種加密、解密都使用不同金鑰的加密演算法,又稱為非對稱式加密 加密使用的是公開金鑰(簡稱公鑰),解密使用的是私密金鑰(簡稱私鑰) 優點是能同時與多數人進行資料傳輸 缺點是有公鑰可信度的問題、加密解密較費時 :::info 公開金鑰密碼系統使用的演算法包含 RSA 加密、橢圓曲線密碼學等,現在多使用 RSA 加密 要找出此系統的具體演算法並不容易,要滿足以下三個條件 能用某數加密數據、能用其他數解密還原數據、防止從一個金鑰推算出另一個金鑰的運算 RSA 能具體實現演算法,因此對於現代網路意義重大 ::: ### 原理概述 資料接收者 B 先製作公鑰、私鑰,接著把公鑰傳送給 A A 使用 B 傳給他的公鑰加密資料,並傳送給 B B 使用私鑰解密,取得原始資料,因為解密的鑰匙在 B 身上,即使 C 拿到資料也無法解密 也因此可以進行多人資料傳輸,因為公鑰被知道也無所謂 ```sequence Note over B: 製作公鑰、私鑰 participant C B --> A: 傳送公鑰 Note over A: 公鑰加密資料 A --> B: 傳送密文 Note over C: 竊取密文\n但沒有私鑰打不開 Note over B: 私鑰解密密文\n獲得資料 ``` ### 問題點 公開金鑰密碼系統有公鑰可信度問題 B 製作公鑰、私鑰,而 C 也製作了假公鑰、假私鑰 當 B 傳送公鑰給 A 時,C 把公鑰換成假公鑰 由於 A 無法得知公鑰製作者的身分,所以不知道公鑰已被替換 A 使用假公鑰加密,並傳送給 B,C 從中竊取加密資料 C 用假私鑰解密資料,並用 B 的公鑰加密資料 因為 B 可以用私鑰解密,所以無法得知資料已被掉包 這種在傳輸過程中,公鑰被替換、數據被偷窺的攻擊方法,稱為中間人攻擊 要解決這種無法確定公鑰製作者是誰的問題,可以使用數位憑證 另外公開金鑰密碼系統加密、解密都很費時,因此這個方法不適合連續傳輸零碎的數據 解決辦法是使用混成密碼系統 ### 小結 ||共用金鑰(對稱式)|公開金鑰(非對稱式)| |:--:|:--:|:--:| |安全性|相對低|相對高| |運算速度|![image](https://hackmd.io/_uploads/Sy0LfwdGA.png)|![image](https://hackmd.io/_uploads/S1tdGDuMA.png)| |必須克服的問題|金鑰傳送困難|中間人攻擊、運算速度慢| ## 混成密碼系統 共用金鑰密碼系統有金鑰傳送困難的問題,公開金鑰密碼系統有加密解密速度很慢的問題 而混成密碼系統是結合兩者方式,並彌補各自缺點的密碼系統,也稱為信封式加密(Envelope encryption) ### 原理概述 A 用處理速度很快的共用金鑰密碼系統加密,而 A 必須想辦法把金鑰(以下簡稱Key)給 B B 用公開金鑰密碼系統,製作公鑰、私鑰,把公鑰傳遞給 A A 用 B 的公鑰加密 Key,並傳送給 B,B 使用私鑰解密,取得 Key 接下來 A 就可以放心的將加密過的資料傳遞給 B,B 使用 Key 快速解密,取得資料 ```sequence Note over A: 製作金鑰\n金鑰加密資料 participant C Note over B: 製作公鑰、私鑰 B --> A: 傳送公鑰 Note over A: 公鑰加密金鑰 A --> B: 傳送加密後的金鑰 Note over C: 竊取加密後的金鑰\n但沒有私鑰打不開 Note over B: 私鑰解密金鑰\n獲得金鑰 Note left of A: 進行密文傳遞\n(以下省略...) ``` 主要是在加密解密數據時,使用共用金鑰密碼系統節省時間 並確保對象能安全的取得解密數據的金鑰,所以使用公開金鑰密碼系統對金鑰加密 如此一來,對象可以安全的拿到金鑰,並對數據進行解密 傳遞的過程都使用公鑰與密文,所以沒有安全的疑慮 :::info 混成密碼系統兼具安全性、處理速度,這種密碼系統用於確保網路資安的安全協定 SSL SSL 是安全通訊端層的縮寫,正式名稱為 TLS 傳輸層安全協議 ::: ## 迪菲-赫爾曼金鑰交換 這是一種讓雙方安全交換金鑰的方法,實際上並非交換金鑰 而是產生新的相同金鑰,這個方法又稱迪菲-赫爾曼金鑰演算法 ### 原理概述 主要是用一種特殊方式可將兩把金鑰合而為一,產生新的金鑰 而這個金鑰有三個特徵 : 1. 即使有一把金鑰、一把合成過的金鑰,也無法取得另一把被合成的金鑰 2. 不管用幾把金鑰合成過的金鑰,也可以成為被合成的金鑰 3. 金鑰合成結果與先後順序無關,即 A-B-C 順序合成,與 B-A-C 順序的結果相同 A 準備一把 Z公鑰,並傳遞給 B A 和 B 各自準備一把私鑰,分別為 X私鑰、Y私鑰,並各自妥善保管 A 和 B 各自用私鑰與 Z公鑰合成新的金鑰,分別為 ZX金鑰、ZY金鑰 雙方各自把合成的金鑰傳遞給對方,此時雙方再將傳遞來的合成金鑰與私鑰合成 分別得到 ZYX、ZXY,由於順序無關,所以兩把是相同的金鑰,這樣就安全的完成傳遞 ```sequence Note over A: 準備 Z 公鑰 participant C A --> B: 傳送 Z 公鑰 Note over A: 準備 X 私鑰並與 Z 合成\n獲得新的金鑰 ZX Note over B: 準備 Y 私鑰並與 Z 合成\n獲得新的金鑰 ZY A --> B: 傳送 ZX 金鑰 B --> A: 傳送 ZY 金鑰 Note over C: 即使竊取 Z、ZX、ZY\n也無法取得 X、Y Note over A: 合成 ZY、X\n獲得新的金鑰 ZYX Note over B: 合成 ZX、Y\n獲得新的金鑰 ZXY Note over A,B: ZYX、ZXY 為相同金鑰\n因此即完成金鑰傳遞 ``` ## 訊息識別碼 能夠實現身分識別、檢查訊息完整性的機制,即使是密文,也可能在傳輸時被竄改 在解密時不同的訊息內容,會造成誤會,訊息識別碼就是防範此狀況 ### 原理概述 A 用共用金鑰密碼系統加密資料(以下簡稱密文),並製作產生訊息識別碼的金鑰 A 用安全的方式,把解密的金鑰、產生訊息識別碼的金鑰,傳遞給 B A 用密文和訊息識別碼的金鑰,產生訊息識別碼(縮寫是 MAC),假設為 7f08 A 把製作完成的訊息識別碼 7f08 和密文,傳送給 B B 也用密文和訊息識別碼的金鑰,產生識別碼,比對一下 A 給予的識別碼,即可得知是否被竄改 ```sequence Note over A: 準備金鑰並加密資料\n製作訊息識別碼金鑰 A --> B: 用安全的方式傳送\n解密金鑰、識別碼金鑰 Note over A: 用密文與識別碼金鑰\n產生 7f08 識別碼 A --> B: 傳送 7f08 識別碼、密文 Note over B: 用密文與識別碼金鑰產生識別碼\n比對是否為 7f08 ``` :::info MAC 可以想像成由金鑰和密文排列組合的字串雜湊碼,MAC 的製作方式有很多種 HMAC (雜湊訊息識別碼)、OMAC (單金鑰訊息識別碼)、CMAC (加密訊息識別碼) 現在大多使用 HMAC ::: ### 問題點 然而這個做法也有缺點,由於 A、B 雙方皆可對訊息加密 因此無法證明原始數據的製作者是 A 或 B 如果 A 不懷好意,可以在傳出訊息後,主張那是 B 捏造的訊息,抵賴曾經傳出的訊息 或是 B 不懷好意,自己製作訊息,主張這是 A 傳來的訊息 因為雙方都有金鑰,所以無從驗證製作者,這個詭計可以用數位簽章來防範 ## 數位簽章 數位簽章是在訊息識別碼裏,加入不可抵賴性的機制 這機制是利用只有傳送者才能製作的 數位簽章 數據,來確定訊息的製作者 ### 原理概述 數位簽章的流程與公開金鑰系統恰好相反 由發送者 A 製作公鑰、私鑰(不是由接收者製作),A 把公鑰傳送給 B A 用私鑰加密資料,這個被加密的資料就是數位簽章,A 把準備好的訊息、簽章傳送給 B B 用公鑰解開簽章,確認簽章的訊息與收到的訊息是否一致 此外 B 無法用公鑰製作 A 的簽章,所以也具備不可抵賴性 雖然簽章的密文沒有任何安全性,因為只要有公鑰,任何人都可以解開 但相反的,這個簽章只有擁有私鑰的人能製作,所以就能確定密文的製作者是私鑰擁有者 :::info 因為公開金鑰密碼系統加密、解密很費時,為了縮短時間,實際上不是直接加密訊息 而是求出訊息的雜湊碼,再對雜湊碼加密,作為簽章 ::: ### 問題點 數位簽章的傳送者有可能是他人偽裝的 原因是使用公開金鑰密碼系統時,無法得知公鑰的擁有者是誰 因為公鑰中並沒有任何製作者的資訊,所以有可能被他人偽裝成是擁有者所製作的公鑰 這個問題可以使用 數位憑證 機制解決 ## 數位憑證 公開金鑰系統和數位簽章的機制,無法確保公鑰的擁有者,因此可能被第三者調包 而使用數位憑證就能確保公鑰的真實性 ### 原理概述 A 製作公鑰、私鑰,接下來向憑證機構(簡稱 CA)申請發行憑證,用來證明公鑰擁有者是 A 憑證機構本身具備公鑰與私鑰,A 把公鑰和含有自己電子郵件地址的個資,傳送給憑證機構 憑證機構確認傳來的資訊是否為 A 本人所有,確認後,用私鑰將 A 的數據做成數位簽章 憑證機構將完成的數位簽章和數據整合成一個電子檔,並傳送給 A,這個就是 A 的數位憑證 取代公鑰,A 把數位憑證傳送給 B,B 確認收到的憑證中所標記的電子郵件地址為 A 接著 B 向憑證機構取得公鑰,B 驗證憑證是否為該機構發行(公鑰能解開,即憑證為該機構發行) 確認憑證為該機構發行且隸屬於 A 後,從憑證中取出 A 的公鑰,這樣就完成 A 傳送公鑰給 B 的步驟 即使壞人 C 將公鑰傳送給 B,B 不需要理會來路不明的公鑰 若 C 在憑證機構登入自己的公鑰呢?不用擔心,因為 C 沒有 A 的電子郵件地址,所以無法發行憑證 在上述有一個問題點,B 向憑證機構取得公鑰,那公鑰確定是憑證機構製作的嗎? 事實上,憑證機構的公鑰也會以數位憑證的方式提供,而這個憑證的發行者,就是更上層的憑證機構 位於最上層的憑證機構稱為 根憑證機構(root CA),自己的真實性由本身來證明 而根憑證機構用來證明自己的憑證,稱為 根憑證,根憑證機構的組織本身若不值得信賴 就不會有人使用,所以根憑證機構多為大企業、政府機關等已經獲得社會信賴的組織 :::info 憑證機構是管理數位憑證的組織,基本上任何人都能成為憑證機構,所以這類機構數量龐大 因此選擇政府機關、接受審計監察的大企業等值得信賴的組織,較為安全 ::: :::info 上述都是以個人為單位收發公開金鑰的情況,但與網站進行通訊時,也會用到數位憑證 從網站取得附有公開金鑰的憑證,就能確認這個網站並非由第三人偽裝 這種憑證稱為 伺服器憑證,同樣是由憑證機構發行 個人憑證是與電子郵件綁在一起,伺服器憑證則是和網域連在一起 透過憑證可以確認管理這個網站網域的組織,以及管理存放網站內容的伺服器的組織,兩者是相同的 這樣的社會機制,可以讓數位憑證透過憑證機構,來確保公鑰製作者的身份 這一連串的機制稱為 公開金鑰基礎架構(PKI) 或稱 公開金鑰基礎建設 ::: ## 未完成事項 - 數位簽章、數位憑證的順序圖 - 文章排版