r、s sm2签名值_用Openssl计算ECDSA签名
时间: 2024-02-11 19:04:34 浏览: 84
好的,针对您的问题,我可以为您提供以下参考步骤:
1. 确定您要签名的消息及其哈希值,假设为 `msg_hash`。
2. 生成 ECDSA 密钥对,假设为 `priv_key` 和 `pub_key`。
3. 使用 OpenSSL 库中的 `EC_KEY_set_private_key` 和 `EC_KEY_set_public_key` 函数设置 ECDSA 密钥对。
4. 使用 OpenSSL 库中的 `ECDSA_do_sign` 函数计算签名值,并存储在一个名为 `sig` 的变量中。示例代码如下:
```c
ECDSA_SIG *sig = ECDSA_do_sign(msg_hash, sizeof(msg_hash), priv_key);
```
5. 将签名值 `sig` 转换为 r 和 s 值,分别存储在名为 `r` 和 `s` 的变量中。示例代码如下:
```c
const BIGNUM *r_bn, *s_bn;
ECDSA_SIG_get0(sig, &r_bn, &s_bn);
char *r_hex = BN_bn2hex(r_bn);
char *s_hex = BN_bn2hex(s_bn);
```
6. 最终,您可以将 `r` 和 `s` 值转换为任何格式,如十六进制字符串或字节数组,以便后续使用。
希望这些信息可以帮助到您!如果您有任何其他问题,请随时问我。
相关问题
nginx适配openssl生成的sm2证书
Nginx是一款流行的Web服务器和反向代理服务器,用于处理HTTP请求。当使用 OpenSSL 生成 SM2 (安全多方密码) 证书时,你需要将这个证书配置到 Nginx 中以便支持 HTTPS 和SM2加密。
以下是基本步骤:
1. **生成 SM2 证书**:
- 使用 OpenSSL 的 `genpkey` 和 `req` 命令生成私钥(`.pem` 或 `.der` 格式)和证书 Signing Request (CSR),如:
```
openssl genpkey -algorithm SM2 > private.key
openssl req -new -key private.key -out sm2.csr
```
2. **获取 CA 签名**:
- 将 CSR 发送给支持 SM2 的证书颁发机构(CA) 获取签名,CA会返回一个带有签名的证书 (.cer 或 .pem 格式)。
3. **转换成 Nginx 可用格式**:
- 如果收到的是 `.cer` 文件,可以先将其转换成 `.pem`:
```
openssl x509 -in sm2.crt.pem -inform der -outform pem -out sm2.crt.pem
```
- 对于 SM2 密钥,同样转换成 `.pem`:
```
openssl pkcs8 -topk8 -nocrypt -in private.key -out private.key.pem
```
4. **配置 Nginx**:
- 配置 Nginx 的 SSL 模块,添加以下内容到你的 Nginx server block 或者全局配置中:
```nginx
ssl_certificate /path/to/sm2.crt.pem;
ssl_certificate_key /path/to/private.key.pem;
ssl_protocols TLSv1.3; # 使用 SM2 支持的协议版本
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256"; # 选择合适的加密套件
```
5. **重启 Nginx**:
- 修改完配置后,需要重启 Nginx 服务使其加载新配置。
EVP_PKEY_set_alias_type(pkey,EVP_PKEY_SM2)函数原型
EVP_PKEY_set_alias_type函数的原型如下:
```c
int EVP_PKEY_set_alias_type(EVP_PKEY *pkey, int type);
```
该函数用于设置EVP_PKEY对象的别名类型。在OpenSSL中,EVP_PKEY是一个通用的密钥类型,可以表示各种类型的密钥,如RSA、ECDSA、SM2等。当调用EVP_PKEY_get_type函数时,会返回该密钥类型的枚举值,例如EVP_PKEY_RSA、EVP_PKEY_EC等。但是,有时候我们需要对同一类型的密钥进行区分,例如对于SM2密钥,有公钥和私钥两种,它们的类型都是EVP_PKEY_SM2,但是我们需要对它们进行区分,以便于在程序中进行处理。
因此,可以使用EVP_PKEY_set_alias_type函数设置EVP_PKEY对象的别名类型。例如,可以使用以下代码将一个SM2公钥对象设置为别名类型为EVP_PKEY_SM2PUBLIC:
```c
EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2PUBLIC);
```
这样,在调用EVP_PKEY_get_type函数时,会返回EVP_PKEY_SM2PUBLIC,从而可以区分SM2公钥和私钥对象。
阅读全文