【算法大雜燴】常見算法的歸類和總結——非對稱加密算法

        在上一篇文章【算法大雜燴】常見算法的歸類和總結——對稱加密算法 中我們簡要介紹了常見的對稱加密算法的相關知識。這次我們趁熱打鐵,介紹【非對稱加密算法】, 通過本文的閱讀,你可以瞭解到以下知識:

  • 什麼是非對稱加密算法?
  • 對稱加密算法和非對稱加密算法最本質的區別是什麼?
  • 常見的非對稱算法哪些以及它們的特性和區別是什麼?
  • 非對稱加密算法的應用場景有哪些?

非對稱加密算法


       世界萬物都是平衡的,正如計算機的世界一樣,有0的地方就一定有1;同樣的,在算法理論上,既然有【對稱加密算法】,那肯定就會有【非對稱加密算法】。

        非對稱算法,顧名思義:算法的執行過程是不對稱的,也就是說加解密雙方的密鑰是不對稱的。在非對稱算法的理論上,密鑰有公鑰和私鑰之分:其中私鑰是代表自己唯一身份的一組密鑰標識,不同的非對稱加密算法,採用不同的數學理論來標識這個“唯一性”,比如RSA算法,使用的是“很大的素數”這種方法來標識;通常來說,私鑰是不對外公開的,就好比藏在自己心裏的祕密一樣,不能被外人知曉,否則,數據的加密就變得不可靠,存在密鑰泄露的風險。與私鑰對應的密鑰叫公鑰,公鑰與私鑰正好相反,它是允許對外公開的,也就是任何人都可以持有加密方的公鑰信息。看到這裏,很多童鞋開始疑問:既然密鑰(公鑰)都公開了,那加密還有什麼用,談何安全性可言?有這樣疑問的童鞋,大概思路還停留在【對稱加密算法】的基礎上,等我詳細講解完【非對稱加密算法】的加密和解密,你就一定明白到底是怎麼一回事了。

        非對稱算法的加密和解密的特點是:一段數據明文經私鑰加密後,則需要使用該私鑰對應的公鑰做解密;反之,一段數據明文經公鑰加密後,則需要使用該公鑰對應的私鑰做解密;即【公鑰加密對應私鑰解密,私鑰加密對應公鑰解密】。使用公式表達如下:其他E表示加密,D表示解密,PriKey表示私鑰,PubKey表示公鑰,A、B分別表示通訊雙方,P表示數據明文,C表示數據密文。

                     通訊方A                                   通訊方B

  • E(P) by PriKey[A]  = C      對應     D(C) by PubKey[A] = P
  • E(P) by PubKey[B]  = C    對應     D(C) by PriKey[B] = P

       通過如上公式,我們可以很清晰的看到,通訊AB雙方需要使用非對稱算法加密通訊報文,必須想方設法獲取到對方的公鑰,這樣整個加密的通道才能完全打通。而前面我們也說到了,自己的公鑰一般都是公開的,允許任何人持有,只要保證自己的私鑰是保密的即可,這就是SSL通訊的理論基礎。在SSL通訊之前,通常會有通訊握手動作,這個握手動作就是爲了取得對方可信任的公鑰,至於如何保證自己取得的公鑰就是對方的真實公鑰,而不是非法監聽報文的“中間人”的假公鑰,這就是SSL雙向認證要解決的核心問題。該部分的內容,後續會有更爲詳細的文章做更近一步的介紹。


對稱加密算法與非對稱加密算法的本質區別


      通過上面對非對稱算法的介紹,大家可以瞭解到非對稱算法核心的部分就是:密鑰分爲公鑰和私鑰,私鑰保密公鑰公開,私鑰加密的密文需要使用公鑰解密,公鑰加密的密文需要私鑰解密。具體的非對稱算法和對稱算法的區別如下表所列:

對稱加密算法和非對稱加密算法的區別
算法 密鑰類型 加密解密的特點
對稱加密算法 通訊雙方有且只有一個共同的密鑰K 加密方使用密鑰K加密,解密方使用密鑰K解密
非對稱加密算法

密鑰有分私鑰和公鑰;

通訊雙方分別持有自己的私鑰和對方的公鑰;

 

加密方使用自己的私鑰加密數據,解密方使用對方的公鑰解密數據;

加密方使用對方的公鑰加密數據,解密方使用自己的私鑰解密數據;


非對稱加密算法的分類和對比


        常見的非對稱加密算法有RSA算法、SM2算法;前者是國際通用的算法,後者是國密算法的一種。

RSA算法

        RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。【摘自: 百度百科 RSA算法 】

        RSA加密算法的密鑰長度不像我們所認知的對稱加密算法 ,它的密鑰長度是可變的,一般用位來表示,常見的有1024位和2048位,甚至4096位。密鑰的位數越長,理論上來說,解密的難度越大,加密的強度就越大。綜合加密級別和使用的便利性,【RSA2048】是我們最常見的。當RSA的密鑰位數確定了,那它的【模長】也就確定了,模長的值爲密鑰位數對應的字節數;計算公式如下,其實M爲模長,B爲密鑰的長度:

  • M = (B + 7) / 8     當M等於1024位時,對應的模長爲128字節;當M等於2048位時,對應的模長爲256字節。

       瞭解【模長】的概念之後,我們需要知道RSA算法執行加密解密操作時,基本的數據塊長度。在RSA算法中,執行加密和解密操作,輸入的數據塊長度都必須等於模長,否則算法內部無法處理;即RSA密鑰的長度不同,對應輸入數據塊的長度也是不同的,這一點與DES、AES等對稱加密算法是完全不一樣的。

       假設我們有4個RSA接口

  • RSA_prikey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
  • RSA_prikey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
  • RSA_pubkey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
  • RSA_pubkey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);

        有趣的是,當我們有一段固定的數據in,分別輸入RSA_pubkey_encrypt和RSA_pubkey_decrypt接口,得出的out居然是一樣的!同樣的在類似的私鑰接口,也有類似的現象。經過這個實驗,我麼可以得出結論:根本沒有所謂的公鑰加密和公鑰解密之分,公鑰加密就是公鑰解密,私鑰加密也就是私鑰解密;所以我們應該對公鑰私鑰、加密解密做個統一叫法,應該就是私鑰運算和公鑰運算。所以以上的接口應改爲:

  • RSA_prikey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
  • RSA_pubkey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);

SM2算法

       SM2算法是國產的非對稱算法,它的誕生就是爲了取代RSA算法。SM2性能更優更安全:密碼複雜度高、處理速度快、機器性能消耗更小。SM2算法和RSA算法比較如下:

  SM2 RSA
算法結構 基本橢圓曲線(ECC) 基於特殊的可逆模冪運算
計算複雜度 完全指數級 亞指數級
存儲空間 192-256bit 2048-4096bit
祕鑰生成速度 較RSA算法快百倍以上
解密加密速度 較快 一般

        SM2算法與RSA算法類型,它也有公鑰和私鑰之分,它的密鑰特點是私鑰固定長度32字節,而公鑰有x和y兩個分量,每個分量都是32字節,總共是64字節。

        在執行加密運算時,輸入數據塊的長度是變長的,而加密後的密文長度等於輸入長度+96字節。

        在執行簽名運算時,輸入數據塊的長度也是變長的,但簽名後的數據長度則固定爲64字節。

        限於篇幅原因,後續再寫專門的文章來介紹SM2算法。


非對稱加密算法的應用場景


        值得注意的是,數據加解密的過程中,雖然公鑰和私鑰都可以用於加密,也都可以用於解密,並沒有嚴格的限制;但是,在實際的應用中,通常有:

  • 私鑰加密,公鑰解密:通常應用有簽名、驗籤,即產生簽名的一方使用自己的私鑰對數據進行簽名操作,而驗籤簽名數據是否合法的一方使用簽名方的公鑰對簽名數據進行驗籤;所以這裏可以簡單地認爲,簽名就是私鑰加密,驗籤就是公鑰解密。
  • 公鑰解密,私鑰解密:通常應用在對數據的加密傳輸,即加密方使用解密方的公鑰做加密動作,這樣就意味着這段加密數據只有解密方一人能解開,因爲解密方的私鑰是不公開的,只有它自己知道,這樣就可以很好地保證的加密數據的安全性。

       此次關於非對稱加密算法的介紹,就到此結束,如果需要學習更多有關非對稱加密算法的知識,可以自行深入學習RSA算法和SM2算法的更多算法細節,相信你一定有更多的收穫。後續會有詳細介紹非對稱算法在實際應用場景的文章,敬請關注,謝謝。

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