如何区分加密、压缩、编码?
原文標題:How to distinguish between encryption, compression, and encoding?
原文作者: M157q
譯文出自:云子可信官方論壇
本文永久鏈接:https://bbs.cloudtrust.com.cn/thread-349-1-1.html
譯者:云子可信漢化組
前言
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,
結論
- 有密鑰:加密、
- 輸出比輸入小:壓縮
- 其他:編碼
總結
以上是生活随笔為你收集整理的如何区分加密、压缩、编码?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《python大战机器学习》勘误
- 下一篇: 汽车网络安全对抗赛