1. 程式人生 > >淺談對稱加密與非對稱加密

淺談對稱加密與非對稱加密

作為資訊保安領域的基石,資料加密演算法你或多或少應該用過。可你知道資料加密分成 **對稱加密** ( *symmetric encryption* ) 和 **非對稱加密** ( *asymmetric encryption* ) 兩種嗎?對稱加密與非對稱加密有什麼區別?各自適用於什麼場景? ## 對稱加密 在對稱加密中,我們需要維護一個 **金鑰** ( *secret key* )。資料加密者根據加密演算法用 **金鑰** 對 **明文** 進行加密,得到不可讀懂的 **密文** 。資料解密者根據加密演算法,用同樣的 **金鑰** 對密文進行解密,得到原來的明文。 ![](https://network.fasionchan.com/zh_CN/latest/_images/0fc9c1c151e9b0ea164b3244d0a4bdac.png) 如上圖,在加密和解密的過程中,我們用到了同一個的 **金鑰** ,這樣就是 **對稱加密演算法** 中對稱一詞的由來。那麼,對稱加密演算法都有哪些呢?各自有什麼特點呢? - *AES* ,高階加密標準,新一代加密演算法標準,速度快,安全級別高; - *DES* ,資料加密標準,速度較快,適用於加密大量資料,但安全性較弱; - *Blowfish* ,使用變長金鑰,執行速度很快,非專利演算法,沒有使用限制; - *etc* | 安全級別 ( *Security Level* ) | 工作因素 ( *Work Factor* ) | 演算法 ( *Algorithm* ) | |:------------- |:--------------- | ------------- | | 薄弱 ( *Weak* ) | $ O(2^{40}) $ | DES | | 傳統 ( *Legacy* ) | $ O(2^{64}) $ | RC4 | | 基準 ( *Baseline* ) | $ O(2^{80}) $ | 3DES | | 標準 ( *Standard* ) | $ O(2^{128}) $ | AES-128 | | 較高 ( *High* ) | $ O(2^{192}) $ | AES-192 | | 超高 ( *Ultra* ) | $ O(2^{256}) $ | AES-256 | 根據安全性,對稱加密演算法應該優先選擇 *AES* ,位數儘可能大,例如 *AES-256* 。 由於所有參與者共享金鑰,只要一人造成洩露便萬劫不復,這是對稱加密最大的弱點。因此,對稱加密金鑰分發、保管必須嚴格控制,以免洩露。 ## 非對稱加密 為解決對稱加密共享金鑰引發的問題,電腦科學家發明了一種更神奇的加密方式。這種加密方式需要兩個金鑰,一個是 **公鑰** ( *public key* )、一個是 **私鑰** ( *private key* )。私鑰由自己保管,不能洩露;公鑰分發給任何需要與自己通訊的參與者,無須保密。 資料加密者根據加密演算法,用公鑰對明文進行加密,得到不可讀懂的密文。資料解密者根據加密演算法,用私鑰對密文進行解密,得到原來的明文。 ![](https://network.fasionchan.com/zh_CN/latest/_images/80ad9b50cce03bf499b54fc0456a33e3.jpg) 由於加密環節和解密環節所用的金鑰不同,因此這種加密方式也稱為 **非對稱加密** ( *asymmetric encryption* )。由於公鑰可以對外公開,也就不用刻意保護了。 此外,如果資料用私鑰進行加密,那麼只有用公鑰才能解密。由於公鑰是公開的,這種機制一般不用於加密資料,而用於對資料進行 **簽名** 。 那麼,非對稱加密有哪些典型的應用場景呢?接下來,我們以一個虛構故事展開討論: *Alice* 是一位幫會大佬,手下有許多小弟, *Bob* 是其中一位。小弟們在外行動,定期彙報成果,接受指令。為保證通訊安全, *Alice* 通過非對稱加密演算法,打造了一對金鑰: ![](https://network.fasionchan.com/zh_CN/latest/_images/6d1c5facbb0c313428c23e0ec173ac94.png?x-oss-process=image/resize,w_300) *Alice* 小心翼翼地保管著私鑰,並把公鑰分發給 *Bob* 等小弟們。 ### 資料加密 小弟 *Bob* 需要向 *Alice* 彙報工作, *Alice* 不希望彙報內容被第三方獲悉,包括其他小弟。這時, *Bob* 用 *Alice* 給的公鑰對彙報資料進行加密,再差人送給 *Alice* 。*Alice* 收到 *Bob* 送來的資料後,用自己手中的私鑰一解,就知道 *Bob* 說啥了。 ![](https://network.fasionchan.com/zh_CN/latest/_images/2b448b9c7af85c164f8124ba77e826bf.png) 由於用公鑰加密的資料只有私鑰能解,而私鑰只有 *Alice* 有,因此彙報內容不可能被第三方知曉。換句話講,只要私鑰不洩露,加密資料便不會被其他人獲悉。 ### 資料簽名 *Alice* 給 *Bob* 下達行動指令,內容雖然可以公開,但 *Alice* 必須防止不法之徒偽造指令。 為此, *Alice* 先借助類似 *MD5* 或 *SHA* 的雜湊演算法,為指令文字計算 **摘要** 。同樣的文字生成的摘要一定相同;不同的文字,哪怕只差一個字母,生成的摘要一定不同。 接著,*Alice* 用私鑰對摘要進行加密,並將加密結果作為 **簽名** 與指令一起發給 *Bob* 。 ![](https://network.fasionchan.com/zh_CN/latest/_images/f944fcc9e487f4ded786d568ef2e6d86.png) *Bob* 接到指令後,用公鑰對簽名進行解密,得到 *Alice* 生成的摘要。然後,他用同樣的演算法,重新為指令文字計算摘要。如果兩個摘要吻合,便可確定指令是 *Alice* 下達的。 其他別有用心的第三方,或許已經掌握了摘要計算方法,但苦於缺少私鑰,也就沒有辦法偽裝成 *Alice* ,向 *Bob* 下達指令了。 這就是非對稱加密的另一個典型使用場景—— **資料簽名** ,可歸納為兩步: 1. 用私鑰對資料進行簽名; 2. 用公鑰對資料進行驗證; ## 附錄 更多 *網路程式設計* 技術文章請訪問:[Linux網路程式設計](https://network.fasionchan.com/),轉至 [原文](https://network.fasionchan.com/zh_CN/latest/security/symmetric-asymmetric-encryption.html) 可獲得最佳閱讀體驗。