日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GmSSL初次探索

發(fā)布時(shí)間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GmSSL初次探索 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

GmSSL初次探索

1.安裝及命令行

GmSSL是一個(gè)支持國(guó)家加密算法標(biāo)準(zhǔn)GM/T的開源加密套件,由于它是OpenSSL的分支,因此保留了OpenSSL1.1.0的所有功能和API級(jí)別的兼容性。遺留項(xiàng)目如Apache的WEB Server可以通過很小的改動(dòng)并重新編譯就適配到GmSSL中。自2014年發(fā)布第一版以來(lái),GmSSL被開源中國(guó)社區(qū)選為6個(gè)推薦的加密項(xiàng)目,同時(shí)也是2015中國(guó)linux軟件獎(jiǎng)得主。

GmSSL的安裝步驟可以按照以下過程來(lái):

#0. 安裝環(huán)境Ubuntu 18.04 LTS#1. 下載GmSSL源碼Github鏈接:https://github.com/guanzhi/GmSSL#2. 編譯安裝在編譯前可選擇性地修改源碼crypto/ec/ec_pmeth.c,第66行改為dctx->ec_encrypt_param = NID_sm3;這里假設(shè)不做修改,以此配置、編譯、安裝cd GmSSL/./configmakesudo make install#3. 刷新動(dòng)態(tài)鏈接庫(kù)默認(rèn)配置下生成的libcrypto和libssl會(huì)安裝在/usr/local/lib目錄,并覆蓋系統(tǒng)openssl中這兩個(gè)庫(kù)的軟鏈接。刷新庫(kù)的話有可能造成部分系統(tǒng)應(yīng)用無(wú)法使用,命令如下:sudo ldconfig如果不刷,可以采用以下方法替代,將環(huán)境變量臨時(shí)修改到安裝包的目錄,此時(shí)命令行可以照常使用:export LD_LIBRARY_PATH=$(pwd)

GmSSL的命令行操作和OpenSSL大同小異,這里演示用SM2標(biāo)準(zhǔn)生成公私鑰對(duì),并進(jìn)行加解密運(yùn)算。

#1. 生成密鑰// 這里輸出了私鑰為dkey.pemgmssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:sm2p256v1 -pkeyopt ec_param_enc:named_curve -out dkey.pem// 這里用私鑰產(chǎn)生公鑰ekey.pemgmssl pkey -pubout -in dkey.pem -out ekey.pem#2. 用公鑰加密,私鑰解密// 加密"Top Secret"這句話并輸出到cipher.sm2文件中// 最后的選項(xiàng)在未改源碼情況下必須要加的echo "Top Secret" | gmssl pkeyutl -encrypt -pkeyopt ec_scheme:sm2 -pubin -inkey ekey.pem -out cipher.sm2 -pkeyopt ec_encrypt_param:sm3// 同理,在添加該選項(xiàng)的情況下解密,結(jié)果會(huì)在終端輸出gmssl pkeyutl -decrypt -pkeyopt ec_scheme:sm2 -inkey dkey.pem -in cipher.sm2 -pkeyopt ec_encrypt_param:sm3

2.用GmSSL編程

這里實(shí)驗(yàn)了部分API的功能,由于時(shí)間有限而網(wǎng)絡(luò)資料偏少,只測(cè)試通過了以SM2標(biāo)準(zhǔn)生成公私鑰文件的功能。公鑰加密功能出現(xiàn)運(yùn)行錯(cuò)誤,未來(lái)得及排查修改。測(cè)試代碼如下,只保留了有用部分:

#include <openssl/conf.h>#include <openssl/evp.h>#include <openssl/err.h>#include <openssl/obj_mac.h>#include <openssl/ec.h>#include <openssl/pem.h>#include <stdio.h>int main(int arc, char *argv[]){/* Load the human readable error strings for libcrypto */ERR_load_crypto_strings();/* Load all digest and cipher algorithms */OpenSSL_add_all_algorithms(); /* Load config file, and other important initialisation */OPENSSL_config(NULL);/* ... Do some crypto stuff here ... *//* EVP函數(shù) 返回1表示成功;返回0表示錯(cuò)誤;-1表示內(nèi)部過程出錯(cuò) *//* 創(chuàng)建用于生成參數(shù)的上下文 */EVP_PKEY_CTX *pctx = NULL;if(!(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL))) goto err;if(EVP_PKEY_paramgen_init(pctx)!=1) goto err;/* 設(shè)置使用的橢圓曲線類型編號(hào)及加密算法 */if(!EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2p256v1)) goto err;if(!EVP_PKEY_CTX_set_ec_param_enc(pctx, OPENSSL_EC_NAMED_CURVE)) goto err;/* 生成上下文密鑰 */EVP_PKEY *key = NULL;if(!EVP_PKEY_keygen_init(pctx)) goto err;if(!EVP_PKEY_keygen(pctx, &key)) goto err;/* 生成PEM格式文件密鑰 */FILE *fp1 = fopen("1Priv.pem","w");FILE *fp2 = fopen("2Pubk.pem","w");/* 輸出私鑰文件 */if(!PEM_write_ECPrivateKey(fp1, EVP_PKEY_get1_EC_KEY(key), NULL, NULL, 0, NULL, NULL)) goto err;/* 輸出公鑰文件 */if(!PEM_write_EC_PUBKEY(fp2, EVP_PKEY_get1_EC_KEY(key))) goto err;fclose(fp1);fclose(fp2);printf("ALL procedures succeed!\n");/* 在這里處理異常,方式為輸出錯(cuò)誤信息 */err:{printf("Exception occured!\n");ERR_print_errors_fp(stderr); //將錯(cuò)誤string輸出標(biāo)準(zhǔn)錯(cuò)誤}/* Clean up *//* Removes all digests and ciphers */EVP_cleanup(); /* if you omit the next, a small leak may be left when you make use of the BIO (low level API) for e.g. base64 transformations */CRYPTO_cleanup_all_ex_data(); /* Remove error strings */ERR_free_strings();return 0;}

編譯并執(zhí)行g(shù)cc -o 1elf main.c -lcrypto && ./1elf,會(huì)生成兩個(gè)PEM格式密鑰文件,可以用命令行代入它們加解密運(yùn)算發(fā)現(xiàn)文件可用。

這里需要說(shuō)的是代碼中主要調(diào)用EVP部分的API。EVP(Envelop)函數(shù)是庫(kù)中提供的高級(jí)API,其大部分API都和命令行參數(shù)有一一對(duì)應(yīng)關(guān)系。有時(shí)要編寫更細(xì)粒度的操作代碼,則可以用一些低級(jí)API,如BIO函數(shù)及各個(gè)密碼算法的對(duì)應(yīng)API。

3.參考文獻(xiàn)

當(dāng)然,最重要的還是留下參考文獻(xiàn)的鏈接,我認(rèn)為有用的參考文檔如下:

  • 官網(wǎng)EVP庫(kù)介紹(主要是對(duì)稱加密函數(shù)和模板)http://gmssl.org/docs/evp-api.html

  • Openssl1.1.0官方Manual的crypto部分https://www.openssl.org/docs/man1.1.0/crypto/

  • 項(xiàng)目Github倉(cāng)庫(kù)的Demos部分(公鑰加密部分不多)https://github.com/guanzhi/GmSSL/tree/master/demos

總結(jié)

以上是生活随笔為你收集整理的GmSSL初次探索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。