國密SM2非對稱算法與實現

國密SM2非對稱算法與實現


介紹

國密SM2是非對稱密碼算法,是基於ECC算法的非對稱算法。SM2算法標準已公佈,有興趣的可下載文檔學習。
國密SM2算法標準包括4個部分,
-第1部分爲總則,主要介紹了ECC基本的算法描述,包括素數域和二元擴域兩種算法描述
-第2部分爲數字簽名算法,這個算法不同於ECDSA算法,其計算量大,也比ECDSA複雜些,也許這樣會更安全吧
-第3部分爲密鑰交換協議,與ECDH功能相同,但複雜性高,計算量加大
-第4部分爲公鑰加密算法,使用ECC公鑰進行加密和ECC私鑰進行加密算法,其實現上是在ECDH上分散出流密鑰,之後與明文或者是密文進行異或運算,並沒有採用第3部分的密鑰交換協議產生的密鑰。
對於SM2算法的總體感覺,應該是國家發明,其計算上比國際上公佈的ECC算法複雜,相對來說算法速度可能慢,但可能是更安全一點。

SM2標準還公佈了一條建議的256位的ECC曲線,但沒有在國際上被公認。SM2算法是好,但要使用,又有很多障礙,就是統一的國際標識與互認,如算法沒有OID標識,曲線也沒有公認OID標識,這在通用上就大打折扣了,這一點需要考慮的。


調研實現

網上可以查到一些SM2算法的實現代碼,有C#的、有Java的,還有C的,但想找到一個完整的C語言代碼還是很難,人家做了不公開,算法標準都公開的,代碼不開源啊,但比較有意義的是這些代碼都是使用Openssl或bouncycastle這些開源的算法庫實現的。但至少給你個信息,使用開源密碼算法可以實現SM2算法。

要實現SM2算法,首先要實現ECC曲線基本描述,這個要獨立去寫還是需要很多計算算法能力的,不是搞數學的,還是有許多難度的。Openssl的ECC算法是SUN公司奉獻的,大家就是大家,寫的就是好。Bouncycastle也是一個比較好的算法,有Java版和C#版,網上可以得到C#的SM2算法,但是使用c語言的代碼能夠下載的SM2都有一點騙人感情啊,只給了代碼測試運行包,沒有公開源碼。

筆者按着這些信息,細細分析了Openssl的ECC、ECDSA、ECDH算法,可以作爲基礎用來實現SM2是豪無問題的,待代碼進一步完善後可以與大家分享。

最後說一下,RSA與ECC。這兩位都是目前主流的非對稱加密算法,也代表了2大加密算法難題,一個是大素數分解,一個離散對數難題。RSA的模長在不斷的加大,1024不可用了,要用2048,這計算量啊要求也大,就需要使用計算量小的ECC算法,但RSA已大行其道這麼多年,還不會馬上被ECC所替換,ECC使用也很複雜,要定義多種曲線,要管理這些參數曲線,否則很難互通,還有專利的限制等等。ECC的加密算法也不同於RSA,有公鑰加密和私鑰解密,而RSA加解密都有啊。不論是RSA還是ECC都是計算上的複雜,隨着時間,密鑰長度都將加長,這就需要有更好的密碼算法來替代了。也許不需要等到那一天,人類社會發展會非常完善,不需要密碼了,是個完全透明的、可信任的社會了。


實現

使用Openssl實現的SM2算法代碼如下: [ 算法實現演示 ],也可請參考ecc資料


參考

在計算點是否滿足方程時,openssl存在依據x查找y時的參數設置,可以參考說明,補充一點個人理解,y存在正負,但是在有限域表示時均爲兩個整數,在點的分佈圖上觀察可以清晰看出這一點。


發佈了9 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章