r、s sm2签名值_用Openssl计算ECDSA签名
时间: 2024-05-06 17:16:29 浏览: 18
您好,ECDSA 签名和 SM2 签名虽然都是基于椭圆曲线的数字签名算法,但是具体的算法细节和参数有所不同。因此,如果您要计算 SM2 签名,需要使用支持 SM2 算法的工具。
以 OpenSSL 为例,如果您的 OpenSSL 版本支持 SM2 算法,可以通过以下命令计算 SM2 签名:
```
openssl sm2 -sign -in <input file> -out <output file> -keyform PEM -key <private key file>
```
其中,<input file> 是要签名的数据文件,<output file> 是签名结果输出的文件,<private key file> 是私钥文件。
如果您需要计算 ECDSA 签名,可以使用以下命令:
```
openssl dgst -sha256 -sign <private key file> -out <output file> <input file>
```
其中,<input file> 是要签名的数据文件,<output file> 是签名结果输出的文件,<private key file> 是私钥文件。注意,这里使用的是 SHA256 摘要算法,您可以根据具体需求选择其他摘要算法。
相关问题
gmssl sm2怎么使用
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的基本使用方法,具体的实现需要根据实际情况进行调整和完善。
c语言实现sm2算法
SM2算法是一种基于椭圆曲线密码体制的公钥密码算法,广泛应用于数字签名、身份认证、密钥协商等场景。在C语言中实现SM2算法需要借助一些常用的密码学库,例如OpenSSL、libgcrypt等。以下是一个使用OpenSSL库实现SM2算法的示例代码:
```
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/bn.h>
#define SM2_NID NID_sm2
#define SM2_PUBKEY_SIZE 65
#define SM2_PRIVKEY_SIZE 32
int sm2_gen_keypair(unsigned char *pubkey, unsigned char *privkey) {
EC_KEY *ec_key = EC_KEY_new_by_curve_name(SM2_NID);
if (ec_key == NULL) {
return -1;
}
if (!EC_KEY_generate_key(ec_key)) {
EC_KEY_free(ec_key);
return -1;
}
const EC_GROUP *ec_group = EC_KEY_get0_group(ec_key);
const EC_POINT *ec_pubkey = EC_KEY_get0_public_key(ec_key);
const BIGNUM *ec_privkey = EC_KEY_get0_private_key(ec_key);
size_t pubkey_len = EC_POINT_point2oct(ec_group, ec_pubkey, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL);
unsigned char *tmp_pubkey = malloc(pubkey_len);
if (tmp_pubkey == NULL) {
EC_KEY_free(ec_key);
return -1;
}
if (EC_POINT_point2oct(ec_group, ec_pubkey, POINT_CONVERSION_UNCOMPRESSED, tmp_pubkey, pubkey_len, NULL) != pubkey_len) {
free(tmp_pubkey);
EC_KEY_free(ec_key);
return -1;
}
memcpy(pubkey, tmp_pubkey + 1, SM2_PUBKEY_SIZE);
memcpy(privkey, ec_privkey, SM2_PRIVKEY_SIZE);
free(tmp_pubkey);
EC_KEY_free(ec_key);
return 0;
}
int sm2_sign(const unsigned char *msg, size_t msg_len, const unsigned char *privkey, unsigned char *signature) {
EC_KEY *ec_key = EC_KEY_new_by_curve_name(SM2_NID);
if (ec_key == NULL) {
return -1;
}
BIGNUM *ec_privkey = BN_bin2bn(privkey, SM2_PRIVKEY_SIZE, NULL);
if (ec_privkey == NULL) {
EC_KEY_free(ec_key);
return -1;
}
if (!EC_KEY_set_private_key(ec_key, ec_privkey)) {
BN_clear_free(ec_privkey);
EC_KEY_free(ec_key);
return -1;
}
const EVP_MD *md = EVP_sm3();
if (md == NULL) {
BN_clear_free(ec_privkey);
EC_KEY_free(ec_key);
return -1;
}
unsigned char digest[EVP_MAX_MD_SIZE];
unsigned int digest_len;
if (!EVP_Digest(msg, msg_len, digest, &digest_len, md, NULL)) {
BN_clear_free(ec_privkey);
EC_KEY_free(ec_key);
return -1;
}
ECDSA_SIG *ec_sig = ECDSA_do_sign(digest, digest_len, ec_key);
if (ec_sig == NULL) {
BN_clear_free(ec_privkey);
EC_KEY_free(ec_key);
return -1;
}
BIGNUM *r = NULL;
BIGNUM *s = NULL;
ECDSA_SIG_get0(ec_sig, (const BIGNUM **)&r, (const BIGNUM **)&s);
int ret = 0;
if (BN_bn2binpad(r, signature + 0, SM2_PRIVKEY_SIZE) != SM2_PRIVKEY_SIZE ||
BN_bn2binpad(s, signature + SM2_PRIVKEY_SIZE, SM2_PRIVKEY_SIZE) != SM2_PRIVKEY_SIZE) {
ret = -1;
}
BN_clear_free(ec_privkey);
ECDSA_SIG_free(ec_sig);
EC_KEY_free(ec_key);
return ret;
}
int sm2_verify(const unsigned char *msg, size_t msg_len, const unsigned char *pubkey, const unsigned char *signature) {
EC_KEY *ec_key = EC_KEY_new_by_curve_name(SM2_NID);
if (ec_key == NULL) {
return -1;
}
const EC_GROUP *ec_group = EC_KEY_get0_group(ec_key);
const EVP_MD *md = EVP_sm3();
if (md == NULL) {
EC_KEY_free(ec_key);
return -1;
}
unsigned char digest[EVP_MAX_MD_SIZE];
unsigned int digest_len;
if (!EVP_Digest(msg, msg_len, digest, &digest_len, md, NULL)) {
EC_KEY_free(ec_key);
return -1;
}
EC_POINT *ec_pubkey = EC_POINT_new(ec_group);
if (ec_pubkey == NULL) {
EC_KEY_free(ec_key);
return -1;
}
if (!EC_POINT_oct2point(ec_group, ec_pubkey, pubkey, SM2_PUBKEY_SIZE, NULL)) {
EC_POINT_free(ec_pubkey);
EC_KEY_free(ec_key);
return -1;
}
ECDSA_SIG *ec_sig = ECDSA_SIG_new();
if (ec_sig == NULL) {
EC_POINT_free(ec_pubkey);
EC_KEY_free(ec_key);
return -1;
}
BIGNUM *r = BN_bin2bn(signature + 0, SM2_PRIVKEY_SIZE, NULL);
BIGNUM *s = BN_bin2bn(signature + SM2_PRIVKEY_SIZE, SM2_PRIVKEY_SIZE, NULL);
int ret = 0;
if (r == NULL || s == NULL || !ECDSA_SIG_set0(ec_sig, r, s) || !ECDSA_do_verify(digest, digest_len, ec_sig, ec_pubkey)) {
ret = -1;
}
BN_clear_free(r);
BN_clear_free(s);
ECDSA_SIG_free(ec_sig);
EC_POINT_free(ec_pubkey);
EC_KEY_free(ec_key);
return ret;
}
```
此代码使用了OpenSSL库的EC模块和ECDSA模块实现了SM2算法的密钥生成、签名和验证功能。在使用之前需要先安装OpenSSL库并链接到编译器中。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)