|
國密即國家密碼局認定的國產(chǎn)密碼算法。主要有SM1,SM2,SM3,SM4和最新的sm9。在國內(nèi)環(huán)境主要使用的國家密碼局認定的算法。 SM2算法:SM2橢圓曲線公鑰密碼算法是我國自主設計的公鑰密碼算法,包括SM2-1橢圓曲線數(shù)字簽名算法,SM2-2橢圓曲線密鑰交換協(xié)議,SM2-3橢圓曲線公鑰加密算法,分別用于實現(xiàn)數(shù)字簽名密鑰協(xié)商和數(shù)據(jù)加密等功能。SM2算法與RSA算法不同的是,SM2算法是基于橢圓曲線上點群離散對數(shù)難題,相對于RSA算法,256位的SM2密碼強度已經(jīng)比2048位的RSA密碼強度要高。 其實就是類似RSA算法,但是大家都知道,RSA算法位數(shù)要求已經(jīng)在2048以上了,SM2不同的是可以使用較少的位數(shù)保證較強的密碼強度。 SM3算法,SM3雜湊算法是我國自主設計的密碼雜湊算法,適用于商用密碼應用中的數(shù)字簽名和驗證消息認證碼的生成與驗證以及隨機數(shù)的生成,可滿足多種密碼應用的安全需求。為了保證雜湊算法的安全性,其產(chǎn)生的雜湊值的長度不應太短,例如MD5輸出128比特雜湊值,輸出長度太短,影響其安全性SHA-1算法的輸出長度為160比特,SM3算法的輸出長度為256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。 與md5相似,但是比md5更長,具有更高的安全性。SM4算法:分組密碼算法是我國自主設計的分組對稱密碼算法,用于實現(xiàn)數(shù)據(jù)的加密/解密運算,以保證數(shù)據(jù)和信息的機密性。要保證一個對稱密碼算法的安全性的基本條件是其具備足夠的密鑰長度,SM4算法與AES算法具有相同的密鑰長度分組長度128比特,因此在安全性上高于3DES算法。 與AES相似。SM9算法:是由國密局發(fā)布的一種IBE(Identity-Based Encryption)算法。IBE算法以用戶的身份標識作為公鑰,不依賴于數(shù)字證書。 一種新型的公私鑰算法,基于身份標識的。openssl的編程初探在算法實現(xiàn)中,不免要使用openssl庫來進行操作,openssl 很強大,提供了健壯的,全功能的加密套件。 openssl官網(wǎng) 有興趣的同學可以詳細去學習下,openssl有著大量的API可以使用,可以實現(xiàn)大量的密碼算法。 開源算法(gmsll.org)這里我使用的是北京大學 關志 副研究員的密碼學研究組開發(fā)維護的 GmSSL ,此項目上openssl的分支,可以替代openssl,并增加了對國密的支持. 在網(wǎng)上找了很多關于此開源庫的使用方法,都不是很明白,我對這個項目的使用方法做一個總結(jié),可以支持在多個平臺上使用。 下面我們來看看具體的使用方法示例代碼可以在 github 上面可以下載得到,給出了測試代碼,可以直接進行下載調(diào)試,主要實現(xiàn)的是 sm2的加解密 , sm4的加解密 ,歡迎star。 使用方法都是:
編譯環(huán)境為(macbook + ubuntu虛擬機) evp api介紹首先是 EVP API ,這是對GmSSL接口的一個封裝,隱藏了API實現(xiàn)的細節(jié),提供了一個抽象的,統(tǒng)一的接口。我們可以借助這個接口來實現(xiàn)其他平臺的使用。 編譯我在Ubuntu環(huán)境下面
make成功后,生成 libcrypto.so.1.1 和 libssl.so.1.1 在code文件夾下面,編寫自己的sm4.c,utils.c,sm2.c 然后利用下面的代碼進行編譯。
測試編寫測試代碼: 運行結(jié)果: 測試成功。 java API的使用方法(Android)介紹在Android里面調(diào)用這個庫的方法,主要是通過編譯.so動態(tài)鏈接庫的方式進行引用。在官方的 github 中,已經(jīng)給出了相關代碼,但是缺少了ndk編譯過程。 編譯坑有些手機里面并不支持,.so.1.1的soname,所以在引用libssl.so.1.1 和libcrypto.so.1.1的時候出現(xiàn)了問題,解決方法是 readelf -d libssl.sorpl -R -e .so.1.1 '_1_1.so' libcrypto.sorpl -R -e .so.1.1 '_1_1.so' libssl.so python 調(diào)用方法坑當使用memcpy或者strcpy進行復制結(jié)果字符串時,在c語言里面運行正常,但是引入到python里面的時候會出現(xiàn)多一位或幾位字符的情況,所以輸出結(jié)果轉(zhuǎn)換成了16進制字符串,這樣結(jié)果就穩(wěn)定了。 |
|
|
來自: 西北望msm66g9f > 《培訓》