【密碼學02】密碼系統原理及數學背景
上一篇文章【密碼學】四大主題簡單介紹 一文提到要實現資訊傳輸的保密性、完整性,以及身份鑒別和抗抵賴,使用的技術手段有:
1) 密碼技術(加密與解密)。
2) 雜湊技術,即散列技術。
3) 隨機數。
4) 時間戳記。
下面先討論密碼技術。
是一個典型的密碼系統,展示了密碼技術的應用情境:
明文:P 密文:C 加密金鑰:K1 解密密鑰:K2 加密方法:E 解密方法:D
加密與解密的關係可以用公式簡潔地表示:
C = EK1(P) 表示用加密金鑰K1通過加密方法E對明文P進行加密得到密文C。
P = DK2(C) 表示用解密密鑰K2通過解密方法D對密文C進行解密得到明文P。
DK2(EK1(P))= P 由上面兩個式子可以得到這個式子。
由此可見,實際上,密碼演算法E和D都是數學函數。
關於密碼學,有兩個基本原則:
1) 訊息必須包含一定的冗餘度。
2) 必須採取措施對抗重放攻擊。
另外,關於密碼系統的設計,還有一個原則叫做Kerckhoff原則:
“密碼演算法必須公開,只有密鑰需要保密。”
這個原則體現了一個思想:讓入侵者知道密碼演算法沒有關係,所有的秘密都隱藏在密鑰中。對密碼演算法保密是不明智的,因為密碼演算法的設計很困難,一旦演算法原理泄露了,必須得花費大量精力重新設計。但密鑰可以隨時更換。
每個密碼演算法,都有其數學背景,依賴某一種數學理論。下面是一些常見密碼演算法的數學理論依據:
1) 資訊理論
由香農(Claude Elmwood Shannon)於1948年創立的現代資訊理論為安全的密碼系統定義了一個精確的數學模型。
2) 複雜性理論
複雜性理論提供了分析密碼演算法的“計算複雜性”的方法。它通過對密碼演算法進行比較,來確定一個密碼演算法的安全性。密碼演算法的“計算複雜性”通常用時間複雜度和空間複雜度兩個變數來度量。
3) 數論
數論中的模運算、素數、最大公因子、求模逆元、費爾馬定理、中國剩餘定理、迦羅瓦域理論等等,是很多密碼學演算法的數學基礎。
4) 因子分解
對一個數進行因子分解就是找出它的素數因子。因子分解是數論中最古老的問題,分解一個數很簡單,卻是一個耗時的過程。一些經典的因子分解演算法有:數域篩選法、二次篩選法、橢圓曲線法等。
5) 計算有限域中的離散對數
計算離散對數是數學中公認的難題。計算離散對數與因子分解有緊密關係,如果能解決離散對數問題,就能解決因子分解問題。
【密碼學03】對稱密碼演算法
前一篇文章【密碼學02】密碼系統原理及數學背景 提到了密碼演算法。每個密碼演算法都基於相應的數學理論。密碼學發展至今,已經產生了大量優秀的密碼演算法,通常分為兩類:對稱密碼演算法和非對稱密碼演算法。
對稱密碼演算法是指有了加密金鑰就可以推算出解密密鑰,有瞭解密密鑰就可以推算出加密金鑰的的演算法。還是用公式表示比較簡潔:
EK1(P)= C
DK2(C)= P
其中E為密碼編譯演算法,D為解密演算法,P為明文,C為密文,K1為加密金鑰,K2為解密密鑰。在對稱密碼演算法中,有了K1,就可以推算出K2,而有了K2,也可以推算出K1。實際應用的大多數對稱密碼演算法中,K1與K2相同。因此對稱密碼演算法的加密與解密關係如下:
EK(P)= C
DK(C)= P
加密與解密都使用密鑰K。
之所以叫對稱式加密演算法,就是加密與解密的密鑰相同。
常見的對稱密碼演算法有以下這些:
1) DES,資料加密標準。由IBM於1970年代開發。DES演算法使用的密鑰長度表示為64位(bit),但每個第8為都用作同位,所以對於使用者而言,密鑰長度是56位。DES將訊息分成64位長的分組,一次加密一個分組,最後一個分組如果不滿64位,需要按照某種策略填滿64位,如所示。
DES由於密鑰太短,而且密鑰空間中存在弱密鑰,因此現在已經不再安全了。1977年斯坦福大學的兩位密碼學大師Diffie和Helman設計了一台機器,只要給定一小段明文和匹配的密文,一天之內即可推算出密鑰。
2) 三重DES,DES的增強版本。如所示,還是利用DES密碼演算法,但是利用三次,加密過程為“加密-解密-加密”,解密過程為“解密-加密-解密”。
用公式可以表示為:
EK1(DK2(EK3(P))) = C //加密
DK1(EK2(DK3(C))) = P //解密
由於三次過程使用的密鑰不一樣,所以相當於增加了密鑰長度。實際應用中,K1和K3是相同的,也就是外層的兩次加密和兩次解密使用相同的密鑰。這樣,三重DES的密鑰長度就相當於K1+K2的長度,即112位(DES的密鑰長度為56位)。採用“加密-解密-加密”模式的理由是為了與DES保持相容,只要設定K1=K2=K3,三重DES不就和DES一樣了嗎?只是多了兩道運算步驟而已。
三重DES只是DES的一個變種,還有其它變種,例如DESX、CRYPT(3)、GDES、RDES、snDES等等。
3) AES,進階加密標準。也叫Rijndael演算法,由兩位比利時密碼學家發明,參與了NIST(美國標準和技術委員會)1997年組織的公開密碼學競賽,最終以優異的技術特性勝出成為加密標準。AES以前一篇文章提到的迦羅瓦域理論為數學基礎。AES也是分塊對資料加密,只是塊的長度並不像DES那樣定死為64位。Rijndael的密鑰長度可以從128位起以32位為間隔遞增到256位。
Rijndael演算法完全公開、安全性好、運算速度極快。如果取密鑰長度為128位,想用窮舉法破解密鑰,就算有一台內含1000億個處理器的電腦,並且每個處理器每秒處理100億個密鑰,也要運行100億年才能搜尋完整個密鑰空間。
4) 其它對稱密碼演算法,有IDEA、Lucifer、Madryga、NewDES、FEAL、REDOC、LOKI、RC2、MMB、GOST、CAST、Blowfish、SAFER、3-WAY、RC5、等等,現在的密碼演算法真是太多了。IDEA是International Data Encryption Algorithm(國際資料加密演算法)的縮寫,該演算法設計者是James Massey和Xuejia Lai(來學嘉)博士。來學嘉是瑞士籍華人,1954年出生,西安電子科大的碩士畢業生。James
Massey是來學嘉的導師。
IDEA演算法安全性比DES好(和AES差不多),能抵抗差分密碼分析的攻擊,而DES不行。IDEA的加密速度比DES快,加密資料速率可達到177MB/秒,也和AES差不多。
【密碼學04】非對稱密碼演算法
上一篇【密碼學03】對稱密碼演算法 介紹了對稱密碼演算法,其主要特性就是加密解密密鑰能互相推算,而實際應用中絕大多數對稱式加密演算法的加密金鑰和解密密鑰是相同的。正因為如此,加密者指定一個密鑰後,必須得想方設法把密鑰分發出去給解密者,同時還得小心翼翼確保密鑰不被泄露。這是對稱密碼演算法固有的一個矛盾,如何解決呢?
還是前面提到的斯坦福兩位密碼學大師Diffie 和Helman,1976年提出了一種全新的密碼系統概念:非對稱密碼演算法。下面看看非對稱密碼演算法的特性。
與對稱密碼演算法相反,非對稱密碼演算法的加密金鑰和解密密鑰不相同,而且從加密金鑰推算出解密密鑰極其困難。簡單來說,非對稱密碼演算法的特性如下:
1) EK1(P) =C //E:密碼編譯演算法,K1:加密金鑰,P:明文,C:密文,下同。
DK2(C) = P //D:解密演算法,K2:解密密鑰。
綜合上面兩個式子,可得:
DK2(EK1(P)) = P
2) 從K1 推斷出K2極其困難。如果密鑰長度足夠長,銀河系中的任何一種生物都應該不可能輕易從K1推出K2,或者從K2推算K1。
3) 某些優秀的非對稱密碼演算法還具有如下特性,但不是所有的演算法都具備:
EK1(DK2(P)) = P
也就是加密函數E與解密函數D互為反函數,解密函數可以當成加密函數來用,加密函數也可以當成解密函數來用。這個特性非常迷人。
具備前面兩個特性以後,加密金鑰就可以放心地公之於眾了。 Alice要用非對稱密碼演算法秘密地傳送訊息給Bob,過程是怎麼樣的呢?首先Bob自己要產生一對密鑰BK1和BK2,他可以任意選擇一個密鑰比如BK1公布給所有人包括Alice,他自己保留BK2不讓任何人知道。Alice知道Bob 公開的密鑰BK1後,就可以用BK1加密明文P得到密文C,然後傳送給Bob。她不用擔心別人能解密訊息,因為BK1加密的訊息只有BK2才能解密,而BK2隻有Bob才知道,想從BK1推算出BK2幾乎不可能。Bob收到訊息,用私密的BK2解密即可得到明文。反過來,Bob要傳送訊息給Alice,Alice也要先產生一對密鑰AK1和AK2,並按照同樣的過程進行。
由於非對稱密碼演算法可以把加密金鑰公開,因此也叫做公開密鑰密碼演算法,簡稱公開金鑰密碼演算法,或公開金鑰演算法。公開金鑰演算法的確是非常優雅地解決了密鑰既要保密又要公開的矛盾。下面是一些常見的公開金鑰密碼演算法。
1) RSA,是MIT(麻省理工學院)三個密碼學大師Rivest、Shamir、Adleman於1978年共同發表,因此名字就是三個人名的首字母。RSA是最優秀的公開金鑰演算法,它滿足上面提到的全部三個特性。RSA演算法的數學基礎是【密碼學02】密碼系統原理及數學背景 一文提到的因子分解。RSA演算法經受住了密碼分析學家們三十年來的大量攻擊,雖然密碼分析學家們不能證明RSA是安全的,但也不能證明RSA是不安全的。RSA已經被廣泛使用,為整個地球村的資訊安全尤其是電子商務的安全做出了極大貢獻。
2) El Gamal,該演算法的數學基礎是【密碼學02】密碼系統原理及數學背景 一文中提到的“計算有限域中的離散對數”的難題。El Gamal演算法也是非常優秀的公開金鑰密碼演算法。
3) 其它公開金鑰密碼演算法還有很多,例如背包演算法、Rabin演算法、Pohlig-Hellman演算法、McEliece演算法、基於橢圓曲線的演算法、LUC演算法等等。
關於背包演算法,Tanenbaum的《Computer Networks》(4th)中講述了一個有趣的故事:背包演算法設計這Merkle曾懸賞100美金破解該演算法,RSA組合中的S,即Shamir迅速破解演算法並領走獎金。Merkle於是增強了演算法,再次懸賞破解,獎金加到1000美金。RSA組合中的R,即Rivest又迅速破解領走獎金。此後Merkle就沒再懸賞了,因此RSA組合中的另外一個人A,即Adleman也就沒能拿到預期的10000美金了。從這個故事可以看出RSA這個資訊安全領域的黃金組合的確超級牛叉!
公開金鑰密碼演算法非常優雅,但是幾乎所有的公開金鑰演算法都有一個問題:速度太慢。RSA演算法的速度是DES的1000分之一,並且密鑰越長,速度會急劇變慢。因此實際應用中密碼系統都是把公開金鑰密碼演算法與對稱密碼演算法結合在一起使用。
【密碼學05】加密模式
大多數密碼演算法都是將明文切成固定長度的多個塊,以塊為單位進行加密,而不是逐個位元組地加密資料。不管什麼樣的密碼演算法,任何時候當同樣的明文塊從演算法前端輸入,同樣的密文塊就從後端輸出。入侵者可以充分發掘這種特性來協助攻破密碼系統。下面舉個例子來說明。
下面這個表描述的是三個人的年終獎金額度。
Alice |
8000 |
Bob |
12000 |
Trudy |
3000 |
老闆授權秘書MM整理好這張表後,秘書MM將其加密,然後提交給財務部門。為了清楚地描述問題,這裡假設這張表的每個欄位都是64位,而且剛好秘書MM用的密碼編譯演算法的加密塊長度也是64位,那麼加密結果可能就是像下面這個樣子:
As9d8912h3a98q 9SDJKVNI |
9d89821as89982mHSLkp[anm |
09djhASDFQWER78sdfHD,zx |
0812UtWEQ23][;[]X/;;\DSKg5p |
78723G/CC;D;LFSDF/;LXPASh |
/.,;ISOFIWERIIOC7kjJKJDFNSAn |
假設在秘書MM發送這段密文之前,不巧讓Trudy看到了。儘管Trudy看不懂這個表的內容,但是當秘書MM抱怨就兩個欄位的表為什麼麼要定死每個欄位長度為64位的時候,Trudy獲得了足夠的資訊。她知道由於自己剛和老闆吵過嘴,獎金肯定沒有其它人高,於是她嘗試將這些密文塊的順序調整了一下,變成下面這個樣子:
As9d8912h3a98q 9SDJKVNI |
0812UtWEQ23][;[]X/;;\DSKg5p |
09djhASDFQWER78sdfHD,zx |
/.,;ISOFIWERIIOC7kjJKJDFNSAn |
78723G/CC;D;LFSDF/;LXPASh |
9d89821as89982mHSLkp[anm |
僅僅是調整一下密文塊的順序,財務部解密訊息的時候完全察覺不到有任何異常。儘管Trudy還是不知道獎金是多少,但是可以很有把握地相信自己的獎金會比原來高。
為了對抗這種問題,需要採取某種加密模式,需要把各個密文塊關聯起來,使得密文任何一處有異常更改,都會導致整個密文作廢。常見的加密模式有以下這。
1) 電子密碼本模式:ECB。這個不用再介紹了,就上面講的有問題的這種模式,每塊明文都對應自己的密文塊,互不相干。雖然有問題,但它也是一種模式,呵呵。
2) 密碼塊鏈模式:CBC。每個純文字塊在加密前,通過按位“異或”操作與前一個塊的密碼文本結合。這樣確保了即使純文字包含許多相同的塊,這些塊中的每一個也會加密為不同的密碼文字區塊。在加密塊之前,初始化向量通過按位“異或”操作與第一個純文字塊結合。如果密碼文字區塊中有一個位出錯,相應的純文字塊也將出錯。此外,後面的塊中與原出錯位的位置相同的位也將出錯。是CBC加密模式。
3) 密碼反饋模式。將少量遞增的純文字處理成密碼文本,而不是一次處理整個塊。該模式使用在長度上為一個塊且被分為幾部分的移位寄存器。例如,如果塊大小為 8 個位元組,並且每次處理一個位元組,則移位寄存器被分為 8 個部分。如果密碼文本中有一個位出錯,則一個純文字位出錯,並且移位寄存器損壞。這將導致接下來若干次遞增的純文字出錯,直到出錯位從移位寄存器中移出為止。CFB加密模式如下。
4) 輸出反饋模式。將少量遞增的純文字處理成密碼文本,而不是一次處理整個塊。此模式與 CFB 相似;這兩種模式的唯一差別是移位寄存器的填充方式不同。如果密碼文本中有一個位出錯,純文字中相應的位也將出錯。但是,如果密碼文本中有多餘或者缺少的位,則那個位之後的純文字都將出錯。
5) 流Cipher 模式。用一個祕密金鑰加密一個初始向量產生一個輸出塊,然後用同樣的金鑰組這個輸出塊進行加密以得到第二個輸出塊,再用同樣的金鑰組這個輸出塊進行加密得到第三個輸出塊,以此類推。所有這些塊的序列叫做密鑰流。逐塊輸出密鑰流時,就逐塊與明文異或,輸出的就是密文。
6) 計數器模式。用一個祕密金鑰加密一個初始向量產生輸出塊,然後將初始向量加1再用同樣的祕密金鑰加密輸出第二個輸出塊,以此類推。輸出的塊序列也是密鑰流,逐塊輸出密鑰流時,就逐塊與明文異或,輸出的就是密文。
7) CTS(密碼文本竊用模式)。處理任何長度的純文字併產生長度與純文字長度匹配的密碼文本。除了最後兩個純文字塊外,對於所有其他塊,此模式與CBC 模式的行為相同。
【密碼學06】資料區塊填充模式
大多數密碼演算法都是塊密碼演算法,需要將明文訊息切成固定大小的塊,一塊一塊地進行加密。例如DES就需要將訊息切割成一個個64位的塊。如果訊息長度不是64的整數倍,最後一個訊息塊就不夠64位,這時就要對最後一個訊息塊進行填充。填充本身是很簡單的事情,問題在於有很多種可行的填充方式,如果加密時以某種方式填充,解密時就得理解這種填充方式並去除填充內容,否則很可能解密出來得到的資料就是髒資料。
某些加密標準指定了特定的填充方案。下面簡單描述一下這些模式的工作原理。
假定塊長度為8位元組,要加密的明文資料長度為9位元組。那麼訊息被切成兩個塊,第二塊只有1個位元組,需要填充7個位元組。假定9位元組的明文資料如下:
F1 F2 F3 F4 F5 F6 F7 F8 F9
以下是常見的四種填充方式:
1) Zeros填充:全部填充為0的位元組,結果如下:
F1 F2 F3 F4 F5 F6 F7 F8 //第一塊
F9 00 00 00 00 00 00 00 //第二塊
2) X923 填充: 填充為0的位元組序列,最後一個位元組記錄填充的總位元組數,結果如下:
F1 F2 F3 F4 F5 F6 F7 F8 //第一塊
F9 00 00 00 00 00 00 07 //第二塊
2) PKCS7 填充: 每個填充的位元組都記錄了填充的總位元組數,結果如下:
F1 F2 F3 F4 F5 F6 F7 F8 //第一塊
F9 07 07 07 07 07 07 07 //第二塊
3) ISO10126 填充: 填充隨機位元組序列,最後一個位元組記錄填充的總位元組數,結果如下:
F1 F2 F3 F4 F5 F6 F7 F8 //第一塊
F9 7D 2A 75 EF F8 EF 07 //第二塊