非對稱加密的應(yīng)用領(lǐng)域

非對稱加密

非對稱加密能夠提供一對密鑰,公鑰和私鑰,使用公鑰加密的內(nèi)容無法使用公鑰進(jìn)行解密,必須使用其對應(yīng)的私鑰才能解密,反之亦然,正好符合我們的要求:

我們可以自己保留私鑰,把公鑰提供給Web程序,這樣注冊文件只能由私鑰生成而無法使用公鑰進(jìn)行生成,用戶即使掌握了公鑰也無法生成注冊文件。

非對稱加密的應(yīng)用領(lǐng)域

簡單介紹一下我們使用的非對稱加密方法:RSA,該方法基于一個數(shù)學(xué)難題:大數(shù)的因子分解,該加密方法已經(jīng)集成在.net的類庫中。

在C#中我們可以使用RSACryptoServiceProvider類進(jìn)行產(chǎn)生密鑰對,明文加密和密文解密的動作。

在使用RSACryptoServiceProvider類的時候我們會發(fā)現(xiàn),類庫要求我們進(jìn)行加密的明文必須為128個字節(jié),多于這個數(shù)量會引發(fā)異常,所以很多朋友在網(wǎng)上提出解決方案,比如把明文切斷,分別加密啦等等,其實我覺得這是一個誤區(qū),要解釋這個誤區(qū),我們得先從非對稱加密的常用領(lǐng)域說起。

非對稱加密的常用領(lǐng)域

使用非對稱加密時我們一般會將私鑰保留,將公鑰分發(fā)給用戶,當(dāng)然,具體的分發(fā)動作是通過證書還是怎么樣不在我們這次的討論范圍內(nèi)。

第一種場景:用戶使用公鑰進(jìn)行加密,則 只能由我們自己的私鑰進(jìn)行解密,就可以保證我們傳遞的信息是加密過的只有私鑰的持有人能夠?qū)γ芪倪M(jìn)行解密,其他人(包括公鑰的持有人)也是無法解密密文的,但是這同樣帶來一個問題,由于非對稱加密實現(xiàn)算法較為復(fù)雜,加密過程比較耗時,因此,我們一般將對稱加密和非對稱加密結(jié)合使用。即:使用對稱加密算法對明文進(jìn)行加密,使用非對稱加密算法對對稱加密的密鑰進(jìn)行加密,其實說到底,就是使用非對稱加密算法進(jìn)行對稱加密密鑰的發(fā)布,這也是“一次一密”的一種實現(xiàn)方法。

第二種場景是我們使用私鑰進(jìn)行加密,公鑰的持有人都可以使用公鑰進(jìn)行解密,這樣,公鑰持有人就可以確認(rèn)該內(nèi)容是由私鑰的持有人發(fā)布出來的,同樣,由于非對稱加密和解密比較耗時的原因,我們可以對該實現(xiàn)方式進(jìn)行改良,最常見的改良方式為:我們可以對明文進(jìn)行散列操作,最終將明文散列為較短的一個散列碼,然后我們使用私鑰對該散列碼進(jìn)行加密,在公鑰的持有人收到消息后,可以重復(fù)上面的操作,比對自己的散列碼和解析出的散列碼是否相同,如果相同,則可以證明該消息是由公鑰的持有人發(fā)布的,這就是我們常說的電子簽名,當(dāng)然我們也可以將上面提到的對稱密鑰的發(fā)布過程也包含在電子簽名的過程中,以此來保證消息的內(nèi)容只有公鑰的持有人能夠查看。

通過上面兩種應(yīng)用場景我們可以發(fā)現(xiàn),非對稱加密算法只要能夠滿足128個字節(jié)的加密就能滿足所有的應(yīng)用需求。