基礎加密演算法(一)

Posted by Lynn on Tuesday, November 22, 2022

前言

在工作的時候很容易遇到介接API時,Request和Response都需要加密,但加密方式有很多種,到現在其實只知道基本概念,對於使用情境跟應用還沒有很深的體會,每次遇到都是先Google再說,趁著這次工作碰到順便整理一下筆記,這篇簡單紀錄一下對密碼學的基本認識,之後再更新相關內容。

什麼是密碼學 Cryptography? 其實就是利用數學演算法和一些數位邏輯對明文進行加解密。 就像以前的人可能利用一些字元替換、偏移等來讓只有特定的對象能解讀訊息一樣,只是在現代電腦科學這麼發達,也就多出了規範和協定。

從IBM的密碼學概觀有列出來幾點在安全性上應該被包括這些面向。

  1. 識別和驗證 Identification and authentication
  2. 授權 Authorization
  3. 保密性 Confidentiality
  4. 資料完整和不可否認性 Data integrity and nonrepudiation

詳細內容可以進連結看,但其實蠻好理解的,畢竟誰希望你想加密的資料少了上面那幾點XD

先來個基本的名詞介紹 原始的資料我們稱為名文(Plaintext),經過一些密碼學的演算法(AES、DES、SHA) 加密(Encrypt) 後會變成密文(Cipertext),再讓特定的對象解密(Decrypt),再加密解密中我們會需要使用金鑰(Key)

加密演算法分類

先來看看Wiki怎麼解釋的

在密碼學中,加密(英語:Encryption)是將明文資訊改變為難以讀取的密文內容,使之不可讀。只有擁有解密方法的對象,經由解密過程,才能將密文還原為正常可讀的內容。 Wiki - 加密

所以我們可以得知,加密後必須要可以解密,有蜂蜜就有蜜蜂

對稱式 Symmetric

對稱式加密的意思是雙方都只會有一組Key,加密訊息和解密訊息都靠這組Key

非對稱式 Asymmetric

非對稱就顧名思義啦~ 他主要是為了解決對稱式加密的問題,因為只要Key一外流出去,那就沒有加密的意義了QQ 一把不行,那就兩把!分為公鑰(Public Key)私鑰(Private Key),但特別的點是公鑰和金鑰必須是一對的,公鑰對外公開拿來加密,私鑰會保存起來用來解密。

我在很多地方看到公私鑰可以互相加密解密,但Wiki上的說明是單向的,後來找了一下資料才發現這件事情其實是相對的,你使用哪個加密那個就叫做公鑰,所以才會有人說私鑰可加密公鑰可解密。 結論還是Wiki上講的 公鑰拿來加密,私鑰拿來解密。


兩個常被誤會的可憐蟲

雜湊 Hash

雜湊最大的特性就是不可逆,可以想像成將一堆東西拿去調理機把他打爛成泥,再也回不來了。 也因為不能解密,所以他其實不是加密演算法。

但他其實是可以推算結果的,就像你拿蘋果拿去打,你會拿到蘋果汁,我今天只要拿一堆東西來試最後只要剛好拿到一顆同樣的蘋果拿去打,就會得到一樣的結果,這又稱暴力破解,所以常常會有加鹽等調味配合雜湊來製造不一樣的結果。

但是,有些情況是你拿不一樣的東西下去打還是得到一樣的結果,這又稱雜湊碰撞(collision),只是機率非常低,而且通常hash的演算法都把這種可能性低到可以忽略不計。

Hash演算法常用在我們希望資料保密且不可回推的情況,例如使用者密碼。

編碼 Encoding

編碼雖然他可以透過解碼取回原值,但他的目的其實跟加密的目的不一樣,他的本質是為了傳輸資料,比方說光電轉換、文字的標記轉換、電子的訊號轉換等等的格式轉換,他的目的就是為了傳輸資料而轉換的存在。