密碼演演算法
用於加密和解密的數學函數
密碼演演算法
一個密碼系統的安全性只在於密鑰的保密性,而不在演演算法的保密性。對純數據的加密的確是這樣。對於你不願意讓他看到這些數據(數據的明文)的人,用可靠的加密演演算法,只要破解者不知道被加密數據的密碼,他就不可解讀這些數據。但是,軟體的加密不同於數據的加密,它只能是“隱藏”。不管你願意不願意讓他(合法用戶,或 Cracker)看見這些數據(軟體的明文),軟體最終總要在機器上運行,對機器,它就必須是明文。既然機器可以“看見”這些明文,那麼 Cracker,通過一些技術,也可以看到這些明文。於是,從理論上,任何軟體加密技術都可以破解。只是破解的難度不同而已。有的要讓最高明的 Cracker 忙上幾個月,有的可能不費吹灰之力,就被破解了。
2.1 概念
(1) 發送者和接收者
假設發送者想發送消息給接收者,且想安全地發送信息:她想確信偷聽者不能閱讀發送的消息。
(2) 消息和加密
消息被稱為明文。用某種方法偽裝消息以隱藏它的內容的過程稱為加密,加了密的消息稱為密文,而把密文轉變為明文的過程稱為解密。
明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、點陣圖、數字化的語音流或數字化的視頻圖像)。至於涉及到計算機,P是簡單的二進位數據。明文可被傳送或存儲,無論在哪種情況,M指待加密的消息。
相反地,解密函數D作用於C產生M
先加密后再解密消息,原始的明文將恢復出來,下面的等式必須成立:
(3) 鑒別、完整性和抗抵賴
除了提供機密性外,密碼學通常有其它的作用:.
(a) 鑒別
消息的接收者應該能夠確認消息的來源;入侵者不可能偽裝成他人。
(b) 完整性檢驗
消息的接收者應該能夠驗證在傳送過程中消息沒有被修改;入侵者不可能用假消息代替合法消息。
(c) 抗抵賴
發送者事後不可能虛假地否認他發送的消息。
(4) 演演算法和密鑰
密碼演演算法也叫密碼,是用於加密和解密的數學函數。(通常情況下,有兩個相關的函數:一個用作加密,另一個用作解密)
如果演演算法的保密性是基於保持演演算法的秘密,這種演演算法稱為受限制的演演算法。受限制的演演算法具有歷史意義,但按現在的標準,它們的保密性已遠遠不夠。大的或經常變換的用戶組織不能使用它們,因為每有一個用戶離開這個組織,其它的用戶就必須改換另外不同的演演算法。如果有人無意暴露了這個秘密,所有人都必須改變他們的演演算法。
更糟的是,受限制的密碼演演算法不可能進行質量控制或標準化。每個用戶組織必須有他們自己的唯一演演算法。這樣的組織不可能採用流行的硬體或軟體產品。但竊聽者卻可以買到這些流行產品並學習演演算法,於是用戶不得不自己編寫演演算法並予以實現,如果這個組織中沒有好的密碼學家,那麼他們就無法知道他們是否擁有安全的演演算法。
儘管有這些主要缺陷,受限制的演演算法對低密級的應用來說還是很流行的,用戶或者沒有認識到或者不在乎他們系統中內在的問題。
現代密碼學用密鑰解決了這個問題,密鑰用K表示。K可以是很多數值里的任意值。密鑰K的可能值的範圍叫做密鑰空間。加密和解密運算都使用這個密鑰(即運算都依賴於密鑰,並用K作為下標表示),這樣,加/解密函數現在變成:
這些函數具有下面的特性:
有些演演算法使用不同的加密密鑰和解密密鑰,也就是說加密密鑰K1與相應的解密密鑰K2不同,在這種情況下:
所有這些演演算法的安全性都基於密鑰的安全性;而不是基於演演算法的細節的安全性。這就意味著演演算法可以公開,也可以被分析,可以大量生產使用演演算法的產品,即使偷聽者知道你的演演算法也沒有關係;如果他不知道你使用的具體密鑰,他就不可能閱讀你的消息。
密碼系統由演演算法、以及所有可能的明文、密文和密鑰組成的。
基於密鑰的演演算法通常有兩類:對稱演演算法和公開密鑰演演算法。下面將分別介紹:
2.2 對稱密碼演演算法
對稱演演算法有時又叫傳統密碼演演算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數對稱演演算法中,加/解密密鑰是相同的。這些演演算法也叫秘密密鑰演演算法或單密鑰演演算法,它要求發送者和接收者在安全通信之前,商定一個密鑰。對稱演演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都能對消息進行加/解密。只要通信需要保密,密鑰就必須保密。
對稱演演算法的加密和解密表示為:
對稱演演算法可分為兩類。一次只對明文中的單個比特(有時對位元組)運算的演演算法稱為序列演演算法或序列密碼。另一類演演算法是對明文的一組比特亞行運算,這些比特組稱為分組,相應的演演算法稱為分組演演算法或分組密碼。現代計算機密碼演演算法的典型分組長度為64比特——這個長度大到足以防止分析破譯,但又小到足以方便使用(在計算機出現前,演演算法普遍地每次只對明文的一個字元運算,可認為是序列密碼對字元序列的運算)。
2.3 公開密碼演演算法
公開密鑰演演算法(也叫非對稱演演算法)是這樣設計的:用作加密的密鑰不同於用作解密的密鑰,而且解密密鑰不能根據加密密鑰計算出來(至少在合理假定的長時間內)。之所以叫做公開密鑰演演算法,是因為加密密鑰能夠公開,即陌生者能用加密密鑰加密信息,但只有用相應的解密密鑰才能解密信息。在這些系統中,加密密鑰叫做公開密鑰(簡稱公鑰),解密密鑰叫做私人密鑰(簡稱私鑰)。私人密鑰有時也叫秘密密鑰。為了避免與對稱演演算法混淆,此處不用秘密密鑰這個名字。
用公開密鑰K加密表示為
雖然公開密鑰和私人密鑰是不同的,但用相應的私人密鑰解密可表示為:
有時消息用私人密鑰加密而用公開密鑰解密,這用於數字簽名(後面將詳細介紹),儘管可能產生混淆,但這些運算可分別表示為:
當前的公開密碼演演算法的速度,比起對稱密碼演演算法,要慢的多,這使得公開密碼演演算法在大數據量的加密中應用有限。
2.4 單向散列函數
單向散列函數 H(M) 作用於一個任意長度的消息 M,它返回一個固定長度的散列值 h,其中 h 的長度為 m 。
輸入為任意長度且輸出為固定長度的函數有很多種,但單向散列函數還有使其單向的其它特性:
(1) 給定 M ,很容易計算 h ;
(2) 給定 h ,根據計算 M 很難;
(3) 給定 M ,要找到另一個消息 M‘ 並滿足 很難。
在許多應用中,僅有單向性是不夠的,還需要稱之為“抗碰撞”的條件:
要找出兩個隨機的消息 M 和 M‘,使滿足很難。
由於散列函數的這些特性,由於公開密碼演演算法的計算速度往往很慢,所以,在一些密碼協議中,它可以作為一個消息 M 的摘要,代替原始消息 M,讓發送者為 H(M) 簽名而不是對 M 簽名。
如 SHA 散列演演算法用於數字簽名協議 DSA中。
2.5 數字簽名
提到數字簽名就離不開公開密碼系統和散列技術。
有幾種公鑰演演算法能用作數字簽名。在一些演演算法中,例如RSA,公鑰或者私鑰都可用作加密。用你的私鑰加密文件,你就擁有安全的數字簽名。在其它情況下,如DSA,演演算法便區分開來了??數字簽名演演算法不能用於加密。這種思想首先由Diffie和Hellman提出。
基本協議是簡單的:
(1) A 用她的私鑰對文件加密,從而對文件簽名。
(2) A 將簽名的文件傳給B。
(3) B用A的公鑰解密文件,從而驗證簽名。
這個協議中,只需要證明A的公鑰的確是她的。如果B不能完成第(3)步,那麼他知道簽名是無效的。
這個協議也滿足以下特徵:
(1) 簽名是可信的。當B用A的公鑰驗證信息時,他知道是由A簽名的。
(2) 簽名是不可偽造的。只有A知道她的私鑰。
(3) 簽名是不可重用的。簽名是文件的函數,並且不可能轉換成另外的文件。
(4) 被簽名的文件是不可改變的。如果文件有任何改變,文件就不可能用A的公鑰驗證。
(5) 簽名是不可抵賴的。B不用A的幫助就能驗證A的簽名。
信息安全