# 基于go封装国密C可访问库 **Repository Path**: state-secret-series/go-gmsm ## Basic Information - **Project Name**: 基于go封装国密C可访问库 - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-03 - **Last Updated**: 2024-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # go-gmsm cgo库 #### 介绍 基于github.com/emmansun/gmsm库编写的SM2对C 开放的库 特性:非对称加密、不支持跨平台编译 git地址:https://gitee.com/state-secret-series/go-gmsm.git #### 软件架构 Go、Cgo、mod #### 安装教程 克隆仓库 ```asm git clone https://gitee.com/state-secret-series/go-gmsm.git ``` 进入go-gmsm目录 ```asm cd go-gmsm ``` 下载依赖 ```asm go mod tidy ``` cgo静态编译 ```asm go build -x -buildmode=c-archive -o libgosm2.a ``` 编译完成后生成 libgosm2.a 、libgosm2.h 文件 #### 使用教程 在C语言中调用 ```asm int main() { GO_SM2_KEY_PAIR key_pair; GO_SM2_SIGNATURE_STRUCT sm2_sig; GO_SM2_ENCRYPT_STRUCT ciphertext; GO_SM2_DECRYPT_STRUCT plaintext; GO_SM2_ERROR_STRUCT error; unsigned char msg[] = {"这是测试数据"}; int msg_len = (int) (strlen((char *) msg)); unsigned char user_id[] = {"1234567812345678"}; int user_id_len = (int) (strlen((char *) user_id)); // unsigned char *ciphertext = NULL; // int ciphertext_len=0; int error_code; error_code = GenerateKeyPair(&key_pair,&error); if(error_code){ printf("GenerateKeyPair failed!%s\n", error.error); return error_code; } print_hex("公钥", key_pair.pub_key, GO_SM2_PUBKEY_LEN); print_hex("私钥", key_pair.pri_key, GO_SM2_PRIKEY_LEN); GoSm2SignData(key_pair.pri_key, GO_SM2_PRIKEY_LEN, msg, msg_len, user_id, user_id_len,GO_SM2_MODE_DEFAULT, &sm2_sig,&error); print_hex("签名", sm2_sig.sig, sm2_sig.sig_len); error_code = Sm2SignVerify(key_pair.pub_key, GO_SM2_PUBKEY_LEN, msg, msg_len, user_id, user_id_len, &sm2_sig,&error); if (error_code) { printf("Verify SM2 signature failed!%d\n", error_code); return error_code; } printf("Verify SM2 signature succeeded!\n"); error_code = Sm2Encrypt(key_pair.pub_key, GO_SM2_PUBKEY_LEN, msg, msg_len, GO_SM2_MODE_ANS1, GO_SM2_ORDER_C1C2C3, &ciphertext,&error); if (error_code) { printf("Sm2Encrypt SM2 Sm2Encrypt failed!%d\n", error_code); return error_code; } printf("Sm2Encrypt SM2 Sm2Encrypt succeeded!\n"); print_hex("加密结果", ciphertext.ciphertext, ciphertext.ciphertext_len); error_code = Sm2Decrypt(key_pair.pri_key,GO_SM2_PRIKEY_LEN,ciphertext.ciphertext, ciphertext.ciphertext_len,GO_SM2_ORDER_C1C2C3,&plaintext,&error); if (error_code) { printf("Sm2Decrypt SM2 Sm2Decrypt failed!%d\n", error_code); return error_code; } printf("Sm2Decrypt SM2 Sm2Decrypt succeeded!\n"); print_hex("解密结果", plaintext.plaintext, plaintext.plaintext_len); printf("文明:%s\n", plaintext.plaintext); return 0; } ```