gmssl sm2怎么使用
时间: 2023-11-27 16:09:56 浏览: 102
sm2+openssl.zip 使用C++实现的openssl调用sm2实现文件签名的功能 C++源代代码可以直接使用
5星 · 资源好评率100%
GMSSL是一个开源的加密库,支持国密标准SM2/SM3/SM4算法,可以在C/C++等编程语言中使用。以下是GMSSL库中SM2的一些基本使用方法:
1. 密钥生成:
```C++
#include <openssl/ec.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/bn.h>
#include <openssl/err.h>
EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_sm2);
if (!ec_key) {
printf("EC_KEY_new_by_curve_name failed\n");
return -1;
}
if (!EC_KEY_generate_key(ec_key)) {
printf("EC_KEY_generate_key failed\n");
EC_KEY_free(ec_key);
return -1;
}
```
2. 签名:
```C++
#include <openssl/ecdsa.h>
unsigned char *msg = (unsigned char *)"Hello, SM2";
unsigned int msglen = strlen((char *)msg);
unsigned char sign[128];
unsigned int signlen;
ECDSA_SIG *ecdsa_sig = ECDSA_do_sign(msg, msglen, ec_key);
if (!ecdsa_sig) {
printf("ECDSA_do_sign failed\n");
EC_KEY_free(ec_key);
return -1;
}
const BIGNUM *r, *s;
ECDSA_SIG_get0(ecdsa_sig, &r, &s);
int rlen = BN_bn2binpad(r, sign, 32);
int slen = BN_bn2binpad(s, sign + rlen, 32);
signlen = rlen + slen;
ECDSA_SIG_free(ecdsa_sig);
```
3. 验签:
```C++
int ret = ECDSA_do_verify(msg, msglen, ecdsa_sig, ec_key);
if (ret == 1) {
printf("Verify success\n");
} else {
printf("Verify failed\n");
}
```
以上是SM2的基本使用方法,具体的实现需要根据实际情况进行调整和完善。
阅读全文