1. 程式人生 > >國密SM2非對稱演算法與實現

國密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都是計算上的複雜,隨著時間,金鑰長度都將加長,這就需要有更好的密碼演算法來替代了。也許不需要等到那一天,人類社會發展會非常完善,不需要密碼了,是個完全透明的、可信任的社會了。