區塊鏈兄弟社區,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者聚集地
作者:於中陽
來源:區塊鏈兄弟
原文鏈接:http://www.blockchainbrother.com/article/73
著權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
1.算法和密鑰
密碼算法(cryptographic algorithm)亦稱為密碼(cipher),其是用於加密和解密的數學函數。一般情況下,會有兩個相關函數,一個用於加密,一個用於解密。
若給予算法的保密性僅僅是基於對保持算法本身的秘密,那么這種算法被稱為受限的(restricted)算法。受限制的算法具有相當的歷史意義,但按照現代的標准,其保密性已經遠遠不夠。舉一個例子,一個組織使用了一種算法,若有一個工作人員離開了這個組織,那么其他的工作者為了安全性就必須改變另外不同的算法。同時,若有人有意或無意的泄露了這個秘密,所有的人都必須改變他們的算法。
與此同時需要指出的是,受限制的密碼算法不可能進行質量控制或標准化。每個用戶組織必須擁有自己的唯一算法。這樣的話,這些組織不可能采用流行的硬件或軟件產品,因為竊聽者是可以通過外界的購買得到這些產品並學習算法的,這就勢必導致用戶不得已必須自己編寫算法並予以實現,但若這個組織中沒有卓越的密碼學家,那么他們是無從得知他們是否擁有了安全的算法。
當然,盡管如此受限制的算法在對密級要求低的應用場景中還是很流行的。
現代密碼學用密鑰(key)這個概念,嘗試解決了這個問題,密鑰用K來表示,K可以是很多數值里的任意值。密鑰K的可能取值范圍叫做密鑰空間(keyspace)。加密和解密運算都會使用到這個密鑰,即運算依賴於密鑰,並用K作為下標表示。這樣一來,加密和解密函數可以改寫為:
以上函數滿足下面等式:
以上這種情況,加密用到的密鑰和解密用到的密鑰是相同的。但有些算法使用的是不同的密鑰進行加密和解密的,即加密密鑰和解密密鑰是不同的。現用表示加密密鑰,表示解密密鑰,在這種情況下:
現在談的這些算法的安全性都是基於密鑰的安全性,而不是基於算法細節的安全性。這就意味着算法是可以公開的,也可以被分析。這樣就可以大量生產使用算法的產品。即使竊聽者知道了你使用的算法也沒從破譯,只要他不知道你具體使用的密鑰,就無法閱讀你的信息消息。
密碼系統(cryptosystem)由算法以及所有可能的明文、密文和密鑰組成。
2.對稱算法
基於密鑰的算法通常有兩類:1)對稱算法,2)公開密鑰算法。對稱算法(symmetric algorithm)又稱為傳統密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數對稱算法中,加密和解密的密鑰是相同的。這些算法也稱為秘密密鑰算法或單密鑰算法,其要求發送者和接收者在確保安全通信之前,協商出一個密鑰。對稱算法的安全性依賴於密鑰,泄密密鑰就意味着任何人都能對信息消息進行閱讀、加密解密。注意,只要通信需要保密,密鑰就必須保密。
對稱算法的加密和解密表示為:
對稱算法又可為兩類,一次僅對明文中的單個位(有時是對字節)運算的算法稱為序列算法(stream algorithm)或序列密碼(stream cipher)。另一類算法是對明文的一組位進行運算,這些位組稱為分組(block),相對應的算法就稱為分組算法(block algorithm)或分組密碼(block cipher)。
現代計算機密碼算法的典型分組長度為64位,這個長度基本足以防止分析破譯,但又十分方便使用。
注:在計算機出現之前,算法普遍的每次只對明文的一個字符運算,可以認為序列密碼是對字符序列的運算。
3.公開密鑰算法(非對稱算法)
公開密鑰算法(public-key algorithm,其有一個更為熟知的稱謂叫非對稱算法),這種算法是這樣設計的,用作加密的密鑰不同於用作解密的密鑰,而且解密密鑰不能根據加密密鑰被計算得到。(注:在合理的假設時間內無法被計算得到即可)這種算法之所以叫做“公開密鑰”算法,是因為加密密鑰是可以公開的,即第三方是能夠使用加密密鑰對信息進行加密的,但只有用相應的解密密鑰才可以對信息進行解密得到解密信息。
在此系統中,加密密鑰稱為公開密鑰(public-key,簡稱公鑰),解密密鑰叫做私人密鑰(private key,簡稱私鑰)。私人密鑰有時也稱為秘密密鑰,但為了避免同對稱算法產生混淆,一般不采用秘密密鑰這種叫法,一般就叫私鑰。
用公開密鑰加密可表示為:
用私人密鑰解密可表示為:
注:必須用公鑰加密和私鑰解密的思維是受限的,有的時候,我們用私鑰進行加密,用公鑰進行解密,這種應用場景常見於數字簽名。
文章發布只為分享區塊鏈技術內容,版權歸原作者所有,觀點僅代表作者本人,絕不代表區塊鏈兄弟贊同其觀點或證實其描述