A. 什麼是ECC
ECC
ECC是「Error Checking and Correcting」的簡寫,中文名稱是「錯誤檢查和糾正」。ECC是一種能夠實現「錯誤檢查和糾正」的技術,ECC內存就是應用了這種技術的內存,一般多應用在伺服器及圖形工作站上,這將使整個電腦系統在工作時更趨於安全穩定。
要了解ECC技術,就不能不提到Parity(奇偶校驗)。在ECC技術出現之前,內存中應用最多的是另外一種技術,就是Parity(奇偶校驗)。我們知道,在數字電路中,最小的數據單位就是叫「比特(bit)」,也叫數據「位」,「比特」也是內存中的最小單位,它是通過「1」和「0」來表示數據高、低電平信號的。在數字電路中8個連續的比特是一個位元組(byte),在內存中不帶「奇偶校驗」的內存中的每個位元組只有8位,若它的某一位存儲出了錯誤,就會使其中存儲的相應數據發生改變而導致應用程序發生錯誤。而帶有「奇偶校驗」的內存在每一位元組(8位)外又額外增加了一位用來進行錯誤檢測。比如一個位元組中存儲了某一數值(1、0、1、0、1、0、1、1),把這每一位相加起來(1+0+1+0+1+0+1+1=5)。若其結果是奇數,對於偶校驗,校驗位就定義為1,反之則為0;對於奇校驗,則相反。當CPU返回讀取存儲的數據時,它會再次相加前8位中存儲的數據,計算結果是否與校驗位相一致。當CPU發現二者不同時就作出視圖糾正這些錯誤,但Parity有個缺點,當內存查到某個數據位有錯誤時,卻並不一定能確定在哪一個位,也就不一定能修正錯誤,所以帶有奇偶校驗的內存的主要功能僅僅是「發現錯誤」,並能糾正部分簡單的錯誤。
通過上面的分析我們知道Parity內存是通過在原來數據位的基礎上增加一個數據位來檢查當前8位數據的正確性,但隨著數據位的增加Parity用來檢驗的數據位也成倍增加,就是說當數據位為16位時它需要增加2位用於檢查,當數據位為32位時則需增加4位,依此類推。特別是當數據量非常大時,數據出錯的幾率也就越大,對於只能糾正簡單錯誤的奇偶檢驗的方法就顯得力不從心了,正是基於這樣一種情況,一種新的內存技術應允而生了,這就是ECC(錯誤檢查和糾正),這種技術也是在原來的數據位上外加校驗位來實現的。不同的是兩者增加的方法不一樣,這也就導致了兩者的主要功能不太一樣。它與Parity不同的是如果數據位是8位,則需要增加5位來進行ECC錯誤檢查和糾正,數據位每增加一倍,ECC只增加一位檢驗位,也就是說當數據位為16位時ECC位為6位,32位時ECC位為7位,數據位為64位時ECC位為8位,依此類推,數據位每增加一倍,ECC位只增加一位。總之,在內存中ECC能夠容許錯誤,並可以將錯誤更正,使系統得以持續正常的操作,不致因錯誤而中斷,且ECC具有自動更正的能力,可以將Parity無法檢查出來的錯誤位查出並將錯誤修正。
2 ECC(Elliptic Curve Cryptosystems )橢圓曲線密碼體制
2002年,美國SUN公司將其開發的橢圓加密技術贈送給開放源代碼工程
公鑰密碼體制根據其所依據的難題一般分為三類:大整數分解問題類、離散對數問題類、橢圓曲線類。有時也把橢圓曲線類歸為離散對數類。
橢圓曲線密碼體制來源於對橢圓曲線的研究,所謂橢圓曲線指的是由韋爾斯特拉斯(Weierstrass)方程:
y2+a1xy+a3y=x3+a2x2+a4x+a6 (1)
所確定的平面曲線。其中系數ai(I=1,2,…,6)定義在某個域上,可以是有理數域、實數域、復數域,還可以是有限域GF(pr),橢圓曲線密碼體制中用到的橢圓曲線都是定義在有限域上的。
橢圓曲線上所有的點外加一個叫做無窮遠點的特殊點構成的集合連同一個定義的加法運算構成一個Abel群。在等式
mP=P+P+…+P=Q (2)
中,已知m和點P求點Q比較容易,反之已知點Q和點P求m卻是相當困難的,這個問題稱為橢圓曲線上點群的離散對數問題。橢圓曲線密碼體制正是利用這個困難問題設計而來。橢圓曲線應用到密碼學上最早是由Neal Koblitz 和Victor Miller在1985年分別獨立提出的。
橢圓曲線密碼體制是目前已知的公鑰體制中,對每比特所提供加密強度最高的一種體制。解橢圓曲線上的離散對數問題的最好演算法是Pollard rho方法,其時間復雜度為,是完全指數階的。其中n為等式(2)中m的二進製表示的位數。當n=234, 約為2117,需要1.6x1023 MIPS 年的時間。而我們熟知的RSA所利用的是大整數分解的困難問題,目前對於一般情況下的因數分解的最好演算法的時間復雜度是子指數階的,當n=2048時,需要2x1020MIPS年的時間。也就是說當RSA的密鑰使用2048位時,ECC的密鑰使用234位所獲得的安全強度還高出許多。它們之間的密鑰長度卻相差達9倍,當ECC的密鑰更大時它們之間差距將更大。更ECC密鑰短的優點是非常明顯的,隨加密強度的提高,密鑰長度變化不大。
德國、日本、法國、美國、加拿大等國的很多密碼學研究小組及一些公司實現了橢圓曲線密碼體制,我國也有一些密碼學者做了這方面的工作。許多標准化組織已經或正在制定關於橢圓曲線的標准,同時也有許多的廠商已經或正在開發基於橢圓曲線的產品。對於橢圓曲線密碼的研究也是方興未艾,從ASIACRYPTO』98上專門開辟了ECC的欄目可見一斑。
在橢圓曲線密碼體制的標准化方面,IEEE、ANSI、ISO、IETF、ATM等都作了大量的工作,它們所開發的橢圓曲線標準的文檔有:IEEE P1363 P1363a、ANSI X9.62 X9.63、 ISO/IEC14888等。
2003年5月12日中國頒布的無線區域網國家標准 GB15629.11 中,包含了全新的WAPI(WLAN Authentication and Privacy Infrastructure)安全機制,能為用戶的WLAN系統提供全面的安全保護。這種安全機制由 WAI和WPI兩部分組成,分別實現對用戶身份的鑒別和對傳輸的數據加密。WAI採用公開密鑰密碼體制,利用證書來對WLAN系統中的用戶和AP進行認證。證書裡麵包含有證書頒發者(ASU)的公鑰和簽名以及證書持有者的公鑰和簽名,這里的簽名採用的就是橢圓曲線ECC演算法。
加拿大Certicom公司是國際上最著名的ECC密碼技術公司,已授權300多家企業使用ECC密碼技術,包括Cisco 系統有限公司、摩托羅拉、Palm等企業。Microsoft將Certicom公司的VPN嵌入微軟視窗移動2003系統中。
B. RSA加密原理
RSA加密是一種非對稱加密。可以在不直接傳遞密鑰的情況下,完成解密。這能夠確保信息的安全性,避免了直接傳遞密鑰所造成的被破解的風險。是由一對密鑰來進行加解密的過程,分別稱為公鑰和私鑰。公鑰加密--私鑰解密,私鑰加密--公鑰解密
在 整數 中, 離散對數 是一種基於 同餘 運算和 原根 的一種 對數 運算。而在實數中對數的定義 log b a 是指對於給定的 a 和 b ,有一個數 x ,使得 b x = a 。相同地在任何群 G 中可為所有整數 k 定義一個冪數為 b K ,而 離散對數 log b a 是指使得 b K = a 的整數 k 。
當3為17的 原根 時,我們會發現一個規律
對 正整數 n,歐拉函數是小於或等於n的正整數中與n 互質 的數的數目(因此φ(1)=1)。有以下幾個特點
服務端根據生成一個隨機數15,根據 3 15 mod 17 計算出6,服務端將6傳遞給客戶端,客戶端生成一個隨機數13,根據 3 13 mod 17 計算出12後,將12再傳回給服務端,客戶端收到服務端傳遞的6後,根據 6 13 mod 17 計算出 10 ,服務端收到客戶端傳遞的12後,根據 12 15 mod 17 計算出 10 ,我們會發現我們通過 迪菲赫爾曼密鑰交換 將 10 進行了加密傳遞
說明:
安全性:
除了 公鑰 用到 n 和 e ,其餘的4個數字是 不公開 的(p1、p2、φ(n)、d)
目前破解RSA得到的方式如下:
缺點
RSA加密 效率不高 ,因為是純粹的數學演算法,大數據不適合RSA加密,所以我們在加密大數據的時候,我們先用 對稱加密 演算法加密大數據得到 KEY ,然後再用 RSA 加密 KEY ,再把大數據和KEY一起進行傳遞
因為Mac系統內置了OpenSSL(開源加密庫),所以我們開源直接在終端進行RSA加密解密
生成RSA私鑰,密鑰名為private.pem,密鑰長度為1024bit
因為在iOS中是無法使用 .pem 文件進行加密和解密的,需要進行下面幾個步驟
生成一個10年期限的crt證書
crt證書格式轉換成der證書
C. 非對稱加密演算法包括哪些
以下是幾種常見的非對稱加密演算法:
1、RSA演算法:RSA演算法是最早被廣泛使用的非對稱加密演算法之一,它利用質數分解的困難性,通過生成公鑰和私鑰來實現加密和解密。
4、ElGamal演算法:ElGamal演算法是一種基於離散對兆豎數問題的加密演算法,它被廣泛應用於數字簽名和加密通信等領域。
這些演算法都是非對稱加密演算法的代表性演算法,它們在不同的場景下談族有著各自的優缺點,應根據實際需求選擇合適的族侍大演算法來進行數據加密和解密。
D. 公鑰密碼→RSA詳解
在對稱密碼中,由於加密和解密的密鑰是相同的,因此必須向接收者配送密鑰。用於解密的密鑰必須被配送給接收者,這一問題稱為 密鑰配送問題 ,如果使用公鑰密碼,則無需向接收者配送用於解密的密鑰,這樣就解決了密鑰配送問題。可以說公鑰密碼是密碼學歷史上最偉大的發明。
解決密鑰配送問題的方法
在人數很多的情況下,通信所需要的密鑰數量會增大,例如:1000名員工中每一個人都可以和另外999個進行通信,則每個人需要999個通信密鑰,整個密鑰數量:
1000 x 999 ÷ 2 = 499500
很不現實,因此此方法有一定的局限性
在Diffic-Hellman密鑰交換中,進行加密通信的雙方需要交換一些信息,而這些信息即便被竊聽者竊聽到也沒有問題(後續文章會進行詳解)。
在對稱密碼中,加密密鑰和解密密鑰是相同的,但公鑰密碼中,加密密鑰和解密密鑰卻是不同的。只要擁有加密密鑰,任何人都可以加密,但沒有解密密鑰是無法解密的。
公鑰密碼中,密鑰分為加密密鑰(公鑰)和解密密鑰(私鑰)兩種。
公鑰和私鑰是一一對應的,一對公鑰和私鑰統稱為密鑰對,由公鑰進行加密的密文,必須使用與該公鑰配對的私鑰才能夠解密。密鑰對中的兩個密鑰之間具有非常密切的關系——數學上的關系——因此公鑰和私鑰是不能分別單獨生成的。
發送者:Alice 接收者:Bob 竊聽者:Eve
通信過程是由接收者Bob來啟動的
公鑰密碼解決了密鑰配送的問題,但依然面臨著下面的問題
RSA是目前使用最廣泛的公鑰密碼演算法,名字是由它的三位開發者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母組成的(Rivest-Shamir-Adleman)。RSA可以被使用公鑰密碼和數字簽名(此文只針對公鑰密碼進行探討,數字簽名後續文章敬請期待)1983年在美國取得了專利,但現在該專利已經過期。
在RSA中,明文、密鑰和密文都是數字,RSA加密過程可以用下列公式來表達
密文 = 明文 E mod N
簡單的來說,RSA的密文是對代表明文的數字的 E 次方求mod N 的結果,換句話說:將明文和自己做 E 次乘法,然後將結果除以 N 求余數,這個余數就是密文。
RSA解密過程可以用下列公式來表達
明文 = 密文 D mod N
對表示密文的數字的 D 次方求mod N 就可以得到明文,換句話說:將密文和自己做 D 次乘法,在對其結果除以 N 求余數,就可以得到明文
此時使用的數字 N 和加密時使用的數字 N 是相同的,數 D 和數 N 組合起來就是RSA的解密密鑰,因此 D 和 N 的組合就是私鑰 。只要知道 D 和 N 兩個數的人才能夠完成解密的運算
根據加密和解密的公式可以看出,需要用到三個數—— E 、 D 和 N 求這三個數就是 生成密鑰對 ,RSA密鑰對的生成步驟如下:
准備兩個很大的質數 p 和 q ,將這兩個數相乘,結果就是 N
N = p x q
L 是 p-1 和 q-1 的最小公倍數,如果用lcm( X , Y )來表示 「 X 和 Y 的最小公倍數」 則L可以寫成下列形式
L = lcm ( p - 1, q - 1)
E 是一個比1大、比 L 小的數。 E 和 L 的最大公約數必須為1,如果用gcd( X , Y )來表示 X 和 Y 的最大公約數,則 E 和 L 之間存在下列關系:
1 < E < L
gcd( E , L ) = 1 (是為了保證一定存在解密時需要使用的數 D )
1 < D < L
E x D mod L = 1
p = 17
q = 19
N = p x q = 17 x 19 = 323
L = lcm ( p - 1, q - 1) = lcm (16,18) = 144
gcd( E , L ) = 1
滿足條件的 E 有很多:5,7,11,13,17,19,23,25,29,31...
這里選擇5來作為 E ,到這里我們已經知道 E = 5 N = 323 這就是公鑰
E x D mod L = 1
D = 29 可以滿足上面的條件,因此:
公鑰: E = 5 N = 323
私鑰: D = 29 N = 323
要加密的明文必須是小於 N 的數,這是因為在加密運算中需要求 mod N 假設加密的明文是123
明文 E mod N = 123 5 mod 323 = 225(密文)
對密文225進行解密
密文 D mod N = 225 29 mod 323 = 225 10 x 225 10 x 225 9 mod 323 = (225 10 mod 323) x (225 10 mod 323) x (225 9 mod 323) = 16 x 16 x 191 mod 323 = 48896 mod 323 = 123(明文)
如果沒有mod N 的話,即:
明文 = 密文 D mod N
通過密文求明文的難度不大,因為這可以看作是一個求對數的問題。
但是,加上mod N 之後,求明文就變成了求離散對數的問題,這是非常困難的,因為人類還沒有發現求離散對數的高效演算法。
只要知道 D ,就能夠對密文進行解密,逐一嘗試 D 來暴力破譯RSA,暴力破解的難度會隨著D的長度增加而加大,當 D 足夠長時,就不能再現實的時間內通過暴力破解找出數 D
目前,RSA中所使用的 p 和 q 的長度都是1024比特以上, N 的長度為2048比特以上,由於 E 和 D 的長度可以和N差不多,因此要找出 D ,就需要進行2048比特以上的暴力破解。這樣的長度下暴力破解找出 D 是極其困難的
E x D mod L = 1 L = lcm ( p - 1, q - 1)
由 E 計算 D 需要使用 p 和 q ,但是密碼破譯者並不知道 p 和 q
對於RSA來說,有一點非常重要,那就是 質數 p 和 q 不能被密碼破譯這知道 。把 p 和 q 交給密碼破譯者與把私鑰交給密碼破譯者是等價的。
p 和 q 不能被密碼破譯者知道,但是 N = p x q 而且 N 是公開的, p 和 q 都是質數,因此由 N 求 p 和 q 只能通過 將 N 進行質因數分解 ,所以說:
一旦發現了對大整數進行質因數分解的高效演算法,RSA就能夠被破譯
這種方法雖然不能破譯RSA,但卻是一種針對機密性的有效攻擊。
所謂中間人攻擊,就是主動攻擊者Mallory混入發送者和接收者的中間,對發送者偽裝成接收者,對接收者偽裝成發送者的攻擊,在這里,Mallory就是「中間人」
這種攻擊不僅針對RSA,而是可以針對任何公鑰密碼。在這個過程中,公鑰密碼並沒有被破譯,所有的密碼演算法也都正常工作並確保了機密性。然而,所謂的機密性並非在Alice和Bob之間,而是在Alice和Mallory之間,以及Mallory和Bob之間成立的。 僅靠公鑰密碼本身,是無法防禦中間人攻擊的。
要防禦中間人攻擊,還需要一種手段來確認所收到的公鑰是否真的屬於Bob,這種手段稱為認證。在這種情況下,我們可以使用公鑰的 證書 (後面會陸續更新文章來進行探討)
網路上很多伺服器在收到格式不正確的數據時都會向通信對象返回錯誤消息,並提示「這里的數據有問題」,然而,這種看似很貼心的設計卻會讓攻擊者有機可乘。 攻擊者可以向伺服器反復發送自己生成的偽造密文,然後分析返回的錯誤消息和響應時間獲得一些關於密鑰和明文的信息。
為了抵禦這種攻擊,可以對密文進行「認證」,RSA-OAEP(最優非對稱加密填充)正是基於這種思路設計的一種RSA改良演算法。
RSA-OAEP在加密時會在明文前面填充一些認證信息,包括明文的散列值以及一定數量的0,然後用RSA進行加密,在解密的過程中,如果解密後的數據的開頭沒有找到正確的認證信息,則可以判定有問題,並返回固定的錯誤消息(重點是,不能將具體的錯誤內容告知開發者)
RSA-OAEP在實際應用中,還會通過隨機數使得每次生成的密文呈現不同的排列方式,從而進一步提高安全性。
隨著計算機技術的進步等,以前被認為是安全的密碼會被破譯,這一現象稱為 密碼劣化 ,針對這一點: