密碼安全之公鑰密碼、散列算法、數字簽名

密碼安全之公鑰密碼、散列算法、數字簽名

上期文章密碼安全之古典密碼、對稱密碼鏈接:
https://blog.csdn.net/qq_26139045/article/details/103153172
密碼開篇文章古典密碼與現代密碼的算法分類結構邏輯圖:
https://blog.csdn.net/qq_26139045/article/details/103113818

公鑰密碼

對稱密碼常用於通信會話中的加密,但隨着對稱加密應用越來越廣,會話密鑰的管理問題也隨之面臨挑戰。在由n個實體的網絡裏,需要的會話密鑰數量爲n(n-1),即達到O(n^2)。而且分組加密主要依賴於多輪複合的擴散和混淆運算,安全強度有待提升。

公鑰密碼也就是非對稱密碼,即加密密鑰和解密密鑰是不同的。一個可以被公開的密鑰被稱爲公鑰,一個私人專用保管的密鑰叫私鑰。公鑰加密的信息只能用對應私鑰來解密。公鑰相比對稱密碼裏的相同密鑰就突出優點了,它可以使用一個公鑰而不需要聯機密鑰服務器,密鑰分配變得簡單,不需要爲了每一個設不同密鑰。一個公鑰就可以完成加密,只要私鑰是保密,就都可以使用對應私鑰解密。這樣就降低了密鑰的管理複雜度,提高了密碼學的可用性。

Diffie-Hellman密鑰交換算法

此密鑰是以Diffie和Hellman命名,下面Alice和ben的DH密鑰交換原理。

(1)選定一個可公開的大質數p和底數g。

(2)Alice和ben分別選定一個私有素數a和b。

DH密鑰協商的目的是讓Alice和Ben安全的獲得共享密鑰,任何第三方實體即使截獲雙方通訊數據,也無法計算得到相同的密鑰。Alice和Ben的協商會話密鑰K的過程爲:

1、Alice和Bob協定使用p=23,g=5

2、Alice選擇一個祕密整數a=6,計算A=g^a mod p並且發送給Bob:A=5^6 mod 23 = 8

3、Bob選擇一個 祕密整數b=15,計算B=g^b mod p併發送給Alice:B = 5^15 mod 23 = 19

4、Alice計算K = B^a mod p,即19^6 mod 23 = 2

5、Bob計算K = A^b mod p ,即8^15 mod 23 =2

DH是一個公鑰算法,應用的數論難題是大數的離散對數求解難題,已知g、a,計算A=g^a是容易的,但反之,已知A和g,求解a是困難的。所以攻擊者就算截獲了A和B,也無法計算得到a和b,更不可能算出K。

RSA公鑰算法

RSA大家可能都經常聽說,在很多CTF題目裏Crypto裏基本都會出現RSA。公開密鑰算法是1976年由當時在美國斯坦福大學的Diffie和Hellman兩人首先發明,但是目前流行的RSA算法則是MIT教授Ronald L.Rivest、Adi Shamir和Leonard M.Adleman共同發明的。RSA也是來自於這3位數學家的名字首字母。RSA算法就是依賴於大數因子分解難題,即給定兩個大素數p、q,計算它們的乘積n=pq是容易的,但反之,給定n,求解p和q是一個經典的數論難題。

(1)密鑰生成

1、選擇兩個大素數:p和q。

2、計算歐拉函數:ф(n) = (p-1)(q-1)

3、選擇一個正整數e,是gcd(e,modф(n)),即e和ф(n)互爲素數。

4、根據de=1(modф(n)),利用Euclid算法計算出d。

5、公鑰即爲K=<e,n>。

6、私鑰即爲S=<d,p,q>

注: Euclid算法即歐幾里德算法又稱輾轉相除法,是指用於計算兩個正整數a,b的最大公約數。應用領域有數學和計算機兩個方面。計算公式gcd(a,b) = gcd(b,a mod b)。

(2)公鑰加密

1、記明文信息爲m(二進制),將m分成等長數據塊m1、m2…,m3,塊長s,其中2^s<=n

2、加密:Ci=mi^e(mod n)

3、解密:mi=ci^d(mod n)

一開始RSA選用的n長度達到512位,但是隨着算力的提升,如今的RSA公鑰長度已經達到了4096bit

公鑰密碼相比對稱密碼,有實現難度大,安全強度大、計算耗費大的特點,所以一般日常使用都是RSA和AES算法混合使用,通常稱爲數字信封技術。就是因爲安全強度大,計算耗費大,所以加密所有明文信息顯然是不太現實和划算。因此使用AES分組加密密文信息,使用RSA加密AES密鑰,這樣既可以保證AES密鑰安全,之前有說到對稱加密的密鑰保護是很重要的,又可以提高加密效率,比較符合使用需求。接收方可以收到RSA加密的AES密鑰和AES密文,只有持有RSA私鑰的合法接收方纔可以解開加密的AES密鑰,從而使用AES密鑰解密密文,得到明文。

散列算法

密碼學上的散列算法是一種測試和保障信息完整性的有效方法,散列函數可以接受任意長度的明文信息輸入,輸出的是一個固定長度的字符串,這個字符串就叫作散列值或信息摘要。

散列算法是獨立於對稱密碼和公鑰密碼體制的,因爲它不需要解密,只是一種保障信息完整性的鑑別算法。A給B發送信息,爲了保障B收到的是完整的信息,所以A會把信息的摘要也隨信息一起發給B,B受到後就可以使用相同的方法再次計算出這段信息的摘要,然後將新的摘要和A發來的摘要進行比對,如果相同說明消息完整,如果不同,那麼B就知道這些數據可能在傳輸過程中被黑客篡改,但是黑客可能也會一起修改散列值,所以依舊有可能欺騙用戶,所以還有其他的技術結合使用,後面會說到。

故而散列算法就需要在密碼學滿足一些特性:

1、輸入長度不受限制,可以是任何長度,可以對任意明文計算散列值。

2、輸入時固定 長度,如MD5是128bit長度,SHA則是256bit

3、給出任意的報文可以很輕鬆地計算出散列函數H(x)

4、散列函數是個不可逆的函數,即給定一個Y,其中,Y=H(x),無法推算出x

5、散列函數不存在碰撞,即不存在一個不同於x的x‘使得H(h)=H(x’)

6、散列函數存在雪崩效應,即明文即使只有細微的區別,其散列值結果也會明顯不同。

例如使用MD5來對兩個明文進行處理:

MD5(“Fujian Agriculture And Forestry University”)=ad568059a39a19391f0b4ec188d54f97

MD5(“Fujian Agriculture Ans Forestry University”)=9c016f80fe5fb45cada72b7746534609

MD5的全稱是Message-Digest Algorithm 5,即信息-摘要算法。經由MD2、MD3、MD4發展而來。但是我國國內的學者王小云教授在2005年首次找到了MD5散列的碰撞,因此最新的業界標準算法轉到了安全散列算法SHA-1和SHA256。

注:王小云女士,是密碼學家,中國科學院院士,清華大學高等研究院楊振寧講座教授,清華大學密碼理論與技術研究中心主任 ,山東大學密碼技術與信息安全教育部重點實驗室主任。

散列算法的典型應用是對一段信息產生信息摘要,以防止被篡改。例如Unix系統下有很多的軟件在下載時都會有一個與文件名相同,文件拓展名位.md5的文件,這個文件裏通常只有一行文本,大概結構如下。

MD5(zjut.tar.gz)=0ca175b9c0f726a831d895e269332461

這個就是zjut.tar.gz文件的數字指紋。MD5將整個文件當作一個大文本信息,通過其不可逆的字符串變換算法,產生了這個唯一的MD5信息摘要。我們平時在下載東西時也可以在某些下載站點看到軟件的MD5值,它的作用在於可以在下載該軟件後,對下載回來的文件用專門的軟件(Windows MD5 Check等)進行一次MD5校驗,確保文件和網站提供的一致。利用MD5算法來進行文件校驗的方案被大量的應用到軟件下載站、論壇數據庫、系統文件安全等方面。

MD5還廣泛的應用與操作系統登錄認證,如Unix、各類BSD系統的登錄密碼、數字簽名等。Unix系統的用戶密碼就是MD5散列運算儲存於文件系統,當用戶登錄時,系統就要把用戶輸入的密碼進行MD5散列運算,在和儲存在文件系統裏MD5值進行比較,進而確定密碼是否正確。這樣的好處時文件系統沒有直接明文存儲密碼,而是密碼的MD5,而我們說過了,散列算法時不可逆的,所以基本時不可逆推算出原來的明文,即使可能存在極小可能的碰撞,但是機率太低了,基本可以忽略,這樣就避免了密碼的泄露,提高了安全性。

所以現在黑客使用最多的密碼破譯方式就是跑字典,也即使暴力破解了。關於字典的話,一是日常收集的用做密碼的字符串表,可以去網上找一些字典,另一種是用排列組合方式生成的,有一些專門的字典生成軟件。先用MD5程序計算出這些字典的MD5值,然後再用目標的MD5值在這個字典裏檢索,但是前提是你可以搞得到目標賬戶的密碼的MD5值。就算有了MD5值也是很低效的。所以散列密碼依舊是最被廣泛使用的密碼技術。

數字簽名

上面說了黑客有可能會修改信息和MD5散列值,已到達攻擊目的。所以需要一種簽名機制,它要保證所有人對文件完整性進行認證,同時又可以驗證這份文件確實是發送者發的,攻擊者無法僞造這個簽名。數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通物理簽名,但是用來公鑰加密領域的技術實現,用於鑑別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,一個用於驗證。

數字簽名是公算法和散列算法的結合應用。數字簽名常常和散列函數在一起使用,給定一段明文M,可以計算出明文的散列值h(M),然後將散列值進行某種加密S後,附在明文上,結構如M|S(h(M))。代表性的又RSA簽名和DSA簽名。

RSA數字簽名

(1)密鑰生成

密鑰生成方式即RSA密鑰生成方式,可以查閱RSA公鑰算法的密鑰生成過程

(2)簽名過程

假設需要加密和簽名的信息位M,其中M在1,2,……,n-1這個範圍內,H爲散列函數,簽名過程如下

S=H(M)^d mod n

(3)驗證過程

計算明文的散列值H(M),同時用公鑰e解密S,再比較H(M)是否和S^e mod n相同,如果相同則驗證成功。

DSA簽名

使用SHA散列加密函數,它的安全性也取決於散列對數的難題。選擇一個1024bit的素數p,此時又一個羣組Zp。選擇另一個160bit的素數q,q除以p-1和q都在羣組Gq中,並且羣組Gq屬於Zp。其中用到的散列算法是SHA-1

(1)密鑰生成

1、選擇p和q,條件就是上面所表達的,換成數學的表達方式就是p=zq+1,並且z屬於羣組Zp

2、選擇一個g,使得jz=g(mod p)成立,並且1<j<p

3、在範圍1,……,q-1內選擇一個隨機數x

4、計算出來y=gx mod p

5、其中的公鑰就是K1=(p,q,g,y),私鑰就是K2=(p,q,g,x)

(2)簽名過程

1、在範圍1,……,q-1內選擇一個隨機數r

2、計算出來的s=(gr mod dp)mod q

3、計算出t=((SHA-1(M)+xs)r-1) mod q

4、將簽名結果(s,t)附屬在消息上

(3)驗簽過程

1、計算出u1=(SHA-1(M)t-1) mod q

2、計算出u2=(st-1) mod q

3、計算簽名s1=((guqyu1)mod p)mod q

4、比較s1於s是否相同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章