加密可以幫助保護數據不被查看和修改,并且可以幫助在本不安全的信道上提供安全的通信方式。例如,可以使用加密算法對數據進(jìn)行加密,在加密狀態(tài)下傳輸數據,然后由預定的接收方對數據進(jìn)行解密。如果第三方截獲了加密的數據,解密數據是很困難的。
在一個(gè)使用加密的典型場(chǎng)合中,雙方(小紅和小明)在不安全的信道上通信。小紅和小明想要確保任何可能正在偵聽(tīng)的人無(wú)法理解他們之間的通信。而且,由于小紅和小明相距遙遠,因此小紅必須確保她從小明處收到的信息沒(méi)有在傳輸期間被任何人修改。此外,她必須確定信息確實(shí)是發(fā)自小明而不是有人模仿小明發(fā)出的。
加密用于達到以下目的:
保密性:幫助保護用戶(hù)的標識或數據不被讀取。
數據完整性:幫助保護數據不更改。
身份驗證:確保數據發(fā)自特定的一方。
為了達到這些目的,您可以使用算法和慣例的組合(稱(chēng)作加密基元)來(lái)創(chuàng )建加密方案。下表列出了加密基元及它們的用法。
| 加密基元 | 使用 |
|---|---|
| 私鑰加密(對稱(chēng)加密) | 對數據執行轉換,使第三方無(wú)法讀取該數據。此類(lèi)型的加密使用單個(gè)共享的機密密鑰來(lái)加密和解密數據。 |
| 公鑰加密(不對稱(chēng)加密) | 對數據執行轉換,使第三方無(wú)法讀取該數據。此類(lèi)加密使用公鑰/私鑰對來(lái)加密和解密數據。 |
| 加密簽名 | 通過(guò)創(chuàng )建對特定方唯一的數字簽名來(lái)幫助驗證數據是否發(fā)自特定方。此過(guò)程還使用哈希函數。 |
| 加密哈希 | 將數據從任意長(cháng)度映射為定長(cháng)字節序列。哈希在統計上是唯一的;不同的雙字節序列不會(huì )哈希為同一個(gè)值。 |
私鑰加密算法使用單個(gè)私鑰來(lái)加密和解密數據。由于具有密鑰的任意一方都可以使用該密鑰解密數據,因此必須保護密鑰不被未經(jīng)授權的代理得到。私鑰加密又稱(chēng)為對稱(chēng)加密,因為同一密鑰既用于加密又用于解密。私鑰加密算法非??欤ㄅc公鑰算法相比),特別適用于對較大的數據流執行加密轉換。
通常,私鑰算法(稱(chēng)為塊密碼)用于一次加密一個(gè)數據塊。塊密碼(如 RC2、DES、TripleDES 和 Rijndael)通過(guò)加密將 n 字節的輸入塊轉換為加密字節的輸出塊。如果要加密或解密字節序列,必須逐塊進(jìn)行。由于 n 很?。▽τ?RC2、DES 和 TripleDES,n = 8 字節;n = 16 [默認值];n = 24;對于 Rijndael,n = 32),因此必須對大于 n 的數據值一次加密一個(gè)塊。
基類(lèi)庫中提供的塊密碼類(lèi)使用稱(chēng)作密碼塊鏈 (CBC) 的鏈模式,它使用一個(gè)密鑰和一個(gè)初始化向量 (IV) 對數據執行加密轉換。對于給定的私鑰 k,一個(gè)不使用初始化向量的簡(jiǎn)單塊密碼將把相同的明文輸入塊加密為同樣的密文輸出塊。如果在明文流中有重復的塊,那么在密文流中將存在重復的塊。如果未經(jīng)授權的用戶(hù)知道有關(guān)明文塊的結構的任何信息,就可以使用這些信息解密已知的密文塊并有可能發(fā)現您的密鑰。若要克服這個(gè)問(wèn)題,可將上一個(gè)塊中的信息混合到加密下一個(gè)塊的過(guò)程中。這樣,兩個(gè)相同的明文塊的輸出就會(huì )不同。由于該技術(shù)使用上一個(gè)塊加密下一個(gè)塊,因此使用了一個(gè) IV 來(lái)加密數據的第一個(gè)塊。使用該系統,未經(jīng)授權的用戶(hù)有可能知道的公共消息標頭將無(wú)法用于對密鑰進(jìn)行反向工程。
可以危及用此類(lèi)型密碼加密的數據的一個(gè)方法是,對每個(gè)可能的密鑰執行窮舉搜索。根據用于執行加密的密鑰大小,即使使用最快的計算機執行這種搜索,也極其耗時(shí),因此難以實(shí)施。使用較大的密鑰大小將使解密更加困難。雖然從理論上說(shuō)加密不會(huì )使對手無(wú)法檢索加密的數據,但這確實(shí)極大增加了這樣做的成本。如果執行徹底搜索來(lái)檢索只在幾天內有意義的數據需要花費三個(gè)月的時(shí)間,那么窮舉搜索的方法是不實(shí)用的。
私鑰加密的缺點(diǎn)是它假定雙方已就密鑰和 IV 達成協(xié)議,并且互相傳達了密鑰和 IV 的值。并且,密鑰必須對未經(jīng)授權的用戶(hù)保密。由于存在這些問(wèn)題,私鑰加密通常與公鑰加密一起使用,來(lái)秘密地傳達密鑰和 IV 的值。
假設小紅和小明是要在不安全的信道上進(jìn)行通信的雙方,他們可能按以下方式使用私鑰加密。小紅和小明都同意使用一種具有特定密鑰和 IV 的特定算法???如 Rijndael)。小紅撰寫(xiě)一條消息并創(chuàng )建要在其上發(fā)送該消息的網(wǎng)絡(luò )流。接下來(lái),她使用該密鑰和 IV 加密該文本,并通過(guò) Internet 發(fā)送該文本。她沒(méi)有將密鑰和 IV 發(fā)送給小明。小明收到該加密文本并使用預先商定的密鑰和 IV 對它進(jìn)行解密。如果傳輸的內容被人截獲,截獲者將無(wú)法恢復原始消息,因為截獲者并不知道密鑰或 IV。在這個(gè)方案中,密鑰必須保密,但 IV 不需要保密。在一個(gè)實(shí)際方案中,將由小紅或小明生成私鑰并使用公鑰(不對稱(chēng))加密將私鑰(對稱(chēng))傳遞給對方。有關(guān)更多信息,請參見(jiàn)本主題后面的有關(guān)公鑰加密的部分。
.NET Framework 提供以下實(shí)現私鑰加密算法的類(lèi):
公鑰加密使用一個(gè)必須對未經(jīng)授權的用戶(hù)保密的私鑰和一個(gè)可以對任何人公開(kāi)的公鑰。公鑰和私鑰都在數學(xué)上相關(guān)聯(lián);用公鑰加密的數據只能用私鑰解密,而用私鑰簽名的數據只能用公鑰驗證。公鑰可以提供給任何人;公鑰用于對要發(fā)送到私鑰持有者的數據進(jìn)行加密。兩個(gè)密鑰對于通信會(huì )話(huà)都是唯一的。公鑰加密算法也稱(chēng)為不對稱(chēng)算法,原因是需要用一個(gè)密鑰加密數據而需要用另一個(gè)密鑰來(lái)解密數據。
公鑰加密算法使用固定的緩沖區大小,而私鑰加密算法使用長(cháng)度可變的緩沖區。公鑰算法無(wú)法像私鑰算法那樣將數據鏈接起來(lái)成為流,原因是它只可以加密少量數據。因此,不對稱(chēng)操作不使用與對稱(chēng)操作相同的流模型。
雙方(小紅和小明)可以按照下列方式使用公鑰加密。首先,小紅生成一個(gè)公鑰/私鑰對。如果小明想要給小紅發(fā)送一條加密的消息,他將向她索要她的公鑰。小紅通過(guò)不安全的網(wǎng)絡(luò )將她的公鑰發(fā)送給小明,小明接著(zhù)使用該密鑰加密消息。(如果小明在不安全的信道如公共網(wǎng)絡(luò )上收到小紅的密鑰,則小明必須同小紅驗證他具有她的公鑰的正確副本。)小明將加密的消息發(fā)送給小紅,而小紅使用她的私鑰解密該消息。
但是,在傳輸小紅的公鑰期間,未經(jīng)授權的代理可能截獲該密鑰。而且,同一代理可能截獲來(lái)自小明的加密消息。但是,該代理無(wú)法用公鑰解密該消息。該消息只能用小紅的私鑰解密,而該私鑰沒(méi)有被傳輸。小紅不使用她的私鑰加密給小明的答復消息,原因是任何具有公鑰的人都可以解密該消息。如果小紅想要將消息發(fā)送回小明,她將向小明索要他的公鑰并使用該公鑰加密她的消息。然后,小明使用與他相關(guān)聯(lián)的私鑰來(lái)解密該消息。
在一個(gè)實(shí)際方案中,小紅和小明使用公鑰(不對稱(chēng))加密來(lái)傳輸私(對稱(chēng))鑰,而對他們的會(huì )話(huà)的其余部分使用私鑰加密。
公鑰加密具有更大的密鑰空間(或密鑰的可能值范圍),因此不大容易受到對每個(gè)可能密鑰都進(jìn)行嘗試的窮舉攻擊。由于不必保護公鑰,因此它易于分發(fā)。公鑰算法可用于創(chuàng )建數字簽名以驗證數據發(fā)送方的身份。但是,公鑰算法非常慢(與私鑰算法相比),不適合用來(lái)加密大量數據。公鑰算法僅對傳輸很少量的數據有用。公鑰加密通常用于加密一個(gè)私鑰算法將要使用的密鑰和 IV。傳輸密鑰和 IV 后,會(huì )話(huà)的其余部分將使用私鑰加密。
.NET Framework 提供以下實(shí)現公鑰加密算法的類(lèi):
公鑰算法還可用于構成數字簽名。數字簽名驗證發(fā)送方的身份(如果您信任發(fā)送方的公鑰)并幫助保護數據的完整性。使用由小紅生成的公鑰,小紅的數據的接收者可以通過(guò)將數字簽名與小紅的數據和小紅的公鑰進(jìn)行比較來(lái)驗證是否是小紅發(fā)送了該數據。
為了使用公鑰加密對消息進(jìn)行數字簽名,小紅首先將哈希算法應用于該消息以創(chuàng )建消息摘要。該消息摘要是數據的緊湊且唯一的表示形式。然后,小紅用她的私鑰加密該消息摘要以創(chuàng )建她的個(gè)人簽名。在收到消息和簽名時(shí),小明使用小紅的公鑰解密簽名以恢復消息摘要,并使用與小紅所使用的相同的哈希算法來(lái)散列消息。如果小明計算的消息摘要與從小紅那里收到的消息摘要完全一致,小明就可以確定該消息來(lái)自私鑰的持有人,并且數據未被修改過(guò)。如果小明相信小紅是私鑰的持有人,則他知道該消息來(lái)自小紅。
請注意,由于發(fā)送方的公鑰為大家所周知,并且它通常包含在數字簽名格式中,因此任何人都可以驗證簽名。此方法不保守消息的機密;若要使消息保密,還必須對消息進(jìn)行加密。
.NET Framework 提供以下實(shí)現數字簽名算法的類(lèi):
哈希算法將任意長(cháng)度的二進(jìn)制值映射為固定長(cháng)度的較小二進(jìn)制值,這個(gè)小的二進(jìn)制值稱(chēng)為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個(gè)字母,隨后的哈希計算都將產(chǎn)生不同的值。要找到散列為同一個(gè)值的兩個(gè)不同的輸入,在計算上是不可能的。
消息身份驗證代碼 (MAC) 哈希函數通常與數字簽名一起用于對數據進(jìn)行簽名,而消息檢測代碼 (MDC) 哈希函數則用于數據完整性。
雙方(小紅和小明)可按下面的方式使用哈希函數來(lái)確保數據的完整性。如果小紅對小明編寫(xiě)一條消息并創(chuàng )建該消息的哈希,則小明可以在稍后散列該消息并將他的哈希與原始哈希進(jìn)行比較。如果兩個(gè)哈希值相同,則該消息沒(méi)有被更改;如果值不相同,則該消息在小紅編寫(xiě)它之后已被更改。為了使此系統發(fā)揮作用,小紅必須對除小明外的所有人保密原始的哈希值。
.NET Framework 提供以下實(shí)現數字簽名算法的類(lèi):
隨機數生成是許多加密操作不可分割的組成部分。例如,加密密鑰需要盡可能地隨機,以便使生成的密鑰很難再現。加密隨機數生成器必須生成無(wú)法以計算方法推算出(低于 p < .05 的概率)的輸出;即,任何推算下一個(gè)輸出位的方法不得比隨機猜測具有更高的成功概率。.NET Framework 中的類(lèi)使用隨機數生成器生成加密密鑰。
RNGCryptoServiceProvider 類(lèi)是隨機數生成器算法的實(shí)現
聯(lián)系客服