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