iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 4
0
自我挑戰組

M157q 的待業程式生活日誌系列 第 4

[2018 iThome 鐵人賽] Day 4: 如何區分加密、壓縮、編碼


前言

base64 加密?base64 壓縮?base64 編碼?傻傻分不清?
究竟:

  • 加密(Encrypt)
  • 壓縮(Compress)
  • 編碼(Encode)

到底有什麼差別?

明明不管是中文還是英文,
這 3 個詞長得一點都不像,
那到底為什麼很多人會把這 3 種東西都當成加密呢?

主要是因為透過這 3 種方式處理過後的資料,
都會長的跟原本不一樣,
一般人無法直接辨別,
就覺得是被加密處理過的密文天書。

然而,
並不是變成人看不懂的東西就叫作「加密」。
如果誤用的話,
很有可能你自以為加密了的東西,
實際上並沒有經過加密處理,
隨隨便便就可以被懂其中差異的人拿到你寶貴的原始文字(最有可能的就是你的密碼啦)。
以下就來簡單說明這 3 種東西各自的特性,
會特別拿 base64 來說,
希望能夠端正一下視聽。


加密(Encryption)

  • 特性
    • 首先得產生一個新的字串作為密鑰,也就是一把鑰匙。
    • 原文與密鑰作為加密演算法的輸入,得到的輸出即為加密過後的密文。
    • 可以想像成,加密演算法幫你打造出你給它的這把密鑰才可以開啟的寶箱,幫你把原文放入寶箱後,用這把密鑰上鎖,上鎖後的寶盒就是密文,看不到裡面的東西是什麼。
    • 這種只有一把鑰匙的加密演算法被稱為對稱式加密(Symmetric Encryption)。
    • 問題也很明顯,要是你沒有保管好你的鑰匙,或者你的鑰匙構造太簡單被人打造出一模一樣的鑰匙,別人就可以打開寶箱,拿到內容物。
      • 比如說你的密鑰是一個叫作 "5566" 的字串,因為太好猜了,所以很容易被解密回來。
      • 這也是為什麼通常在生成密鑰的時候會建議長度愈長愈好,尤其現在電腦的運算能力愈來愈強,以往透過程式一個一個暴力猜測密鑰的方式,在相同單位時間內可以猜的數量變多了,密鑰長度太短的話,很容易就被猜到。
    • 因為對稱式加密的安全性以及在實際應用上不夠理想,於是乎,出現了安全性更高,應用範圍更廣的非對稱式加密(Asymmetric Encryption)。
    • 非對稱式加密演算法會有兩把鑰匙,一把稱做公鑰(可以公開),另一把稱做私鑰(自己要藏好)。
    • 非對稱式加密除了可以做到加密以外,還可以生成數位簽章,確認密文的傳送方身份真的是本人,這篇不會細談。
    • 但這並不代表對稱式加密就沒有人用,兩者各有各的優缺點,所以實際應用上通常都是視情況而定,常常會有兩者一起使用的情形。
  • 常見演算法
    • 對稱式:DES, 3DES, AES
    • 非對稱式:RSA, DSA, ECC
  • 結論
    • 沒有這把鑰匙(無論是拿到或猜到)就無法得知真正的訊息。
    • 使用 base64 的時候不需要密鑰,而且任何人編碼的 base64 訊息,任何人都可以經過 base64 解碼回來,所以 base64 不是加密。

壓縮(Compression)

  • 特性
    • 輸入(通常是檔案)經過壓縮演算法後得到的輸出,大小比輸入來得小。
    • 根據有無失真又區分為非破壞性(無損)壓縮與破壞性(有損)壓縮:
      • 無損壓縮:無失真、壓縮率沒辦法到太高,通常用在文件檔案這種不能缺少原始資料的東西。
      • 有損壓縮:失真、壓縮率可以比較高,通常用在圖片、視訊、音訊,因為可以去掉人眼或人耳無法辨認出差異的部份,降低檔案大小可以有效提升傳輸時的效率。
  • 常見演算法
    • zip, gzip, rar, 7zip, jpg, mp3, mp4, Huffman coding
  • 結論
    • 沒有讓輸出比輸入小的演算法就不是壓縮。
    • 經過 base64 編碼後得到的結果,實際上會比原檔案多三分之一左右,所以 base64 不是壓縮。
      • base64 使用 64 個可顯示的 ASCII 字元來表示二進位資料。
      • 2^6 = 64,也就是一個 base64 單元表示 6 位元,即用 1 個 ASCII 字元(8 bits),表示 6 bits 資料,比例為 4:3,也就大概多了 1/3 出來。
    • 那為什麼很多地方會提到在網頁上用 base64 表示圖片可以加速?
      • 主要是因為把圖片直接以 base64 字串的形式呈現在網頁上的話,就不需要額外再發 request 去要圖片。
      • 但因為 base64 會把檔案變大不少,所以很多人會先把圖片經過 gzip 壓縮後,再編碼成 base64 字串。

編碼(Encoding)

編碼牽涉的範圍非常廣,
包含了:字元編碼(Character Encoding)、音訊編碼(Audio Encoding)、視訊編碼(Video Encoding)、…… 等等,
所以在這篇文章不會仔細講。
其實廣義上來說,
上述提到的加密與壓縮都算是編碼的其中一種,
但這裡就把上述兩個排除。

  • 特性
    • 將原文轉換成另外一種表達方式。
    • 不需要密鑰,只要知道你用哪個編碼演算法,任何人都可以解碼。
      • 這也是單純編碼被拿來誤用成加密演算法最危險的地方,因為完全不需要花時間猜密鑰。
    • 不同的編碼演算法有不同的特性
      • 錯誤偵測(Error Detection)
        • 檢查訊息在經過傳送後是否已經改變。
      • 錯誤校正(Error Correction)
        • 自動修正在經過傳送後錯誤的內容。
      • 方便資料進行傳輸
        • 以不同的形式表示相同的資料。
        • 例如: base64 就把二進位的資料用 ASCII 來表示。
  • 常見演算法
    • base64, urlencode, hamming code,

結論

  • 有密鑰:加密
  • 輸出比輸入小:壓縮
  • 其他:編碼

如果覺得我的文章不錯的話,
歡迎按讚、追蹤、訂閱、留言、分享,
也可以利用像是 Feedly 等 RSS Reader,
直接訂閱我的部落格:https://blog.m157q.tw
因為 iThome 這邊未來我不保證持續更新,
雖然目前用起來沒太大問題,
但就是覺得要管兩個地方有點麻煩。


上一篇
[2018 iThome 鐵人賽] Day 3: 用 Python 寫個程式抓出我在 Twitter 上存了哪些 tweet
下一篇
[2018 iThome 鐵人賽] Day 5: 我愛開源,因為會遇到路人幫我寫測試。
系列文
M157q 的待業程式生活日誌31

尚未有邦友留言

立即登入留言