國密SM2是非對稱密碼算法,是基於ECC算法的非對稱算法。SM2算法標准公布於:http://www.oscca.gov.cn/News/201012/News_1197.htm,有興趣的可下載學習。
國密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算法代碼如下:http://download.csdn.net/detail/goldboar/3833072,為算法實現演示,請參考。