gmssl 将const char* 型 base64 编码的私钥转成EC_KEY*
时间: 2023-07-31 16:10:41 浏览: 134
可以使用 gmssl 库中的 `PEM_read_bio_ECPrivateKey` 函数将 const char* 类型的 Base64 编码的私钥转换为 EC_KEY* 类型的私钥。该函数的使用方法如下:
```c
#include <openssl/pem.h>
#include <openssl/ec.h>
EC_KEY* base64_to_ec_key(const char* b64_key) {
BIO* bio = NULL;
EC_KEY* ec_key = NULL;
// 创建 BIO 对象
bio = BIO_new_mem_buf((void*)b64_key, -1);
// 将 PEM 格式的私钥读取到 EC_KEY 结构体中
ec_key = PEM_read_bio_ECPrivateKey(bio, NULL, NULL, NULL);
// 释放 BIO 对象
BIO_free(bio);
return ec_key;
}
```
调用该函数时,需要传入一个 Base64 编码的私钥字符串,并返回一个 EC_KEY* 类型的私钥。注意,在使用完 EC_KEY 结构体后,需要调用 `EC_KEY_free` 函数来释放内存。
相关问题
gmssl 将const char* 型不带start line 的 base64 编码的私钥转成EC_KEY*
您好,针对您的问题,可以使用以下代码将const char*型不带start line的base64编码的私钥转成EC_KEY*:
```c++
#include <openssl/ec.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/pem.h>
EC_KEY* base64_to_EC_key(const char* b64_key) {
EC_KEY* ec_key = NULL;
BIO* bio = NULL;
BUF_MEM* buf = NULL;
// 将base64编码的私钥解码
bio = BIO_new(BIO_s_mem());
BIO_write(bio, b64_key, strlen(b64_key));
BIO_flush(bio);
BIO_get_mem_ptr(bio, &buf);
if (buf->length <= 0) {
goto end;
}
// 将解码后的私钥导入到EC_KEY结构体中
ec_key = d2i_ECPrivateKey(&ec_key, (const unsigned char**)&buf->data, buf->length);
if (ec_key == NULL) {
goto end;
}
end:
if (bio != NULL) {
BIO_free(bio);
}
if (buf != NULL) {
BUF_MEM_free(buf);
}
return ec_key;
}
```
其中,b64_key为输入的base64编码的私钥,返回值为EC_KEY*类型的指针。函数内部使用BIO_new()函数将输入字符串构造成BIO对象,再使用d2i_ECPrivateKey()函数将解码后的私钥导入到EC_KEY结构体中,并返回EC_KEY*类型的指针。需要注意的是,函数中的错误处理部分需要根据实际情况进行修改。
gmssl 将字符串类型的私钥转成EC_KEY ,用c语言
如果你想在C语言中使用gmssl将字符串类型的私钥转换成EC_KEY对象,可以使用以下步骤:
1. 首先,将字符串类型的私钥转换成bytes类型,可以使用C语言中的字符串处理函数来实现,例如`strtol()`函数将十六进制字符串转换为long类型。
2. 然后,使用gmssl的`EC_KEY_new_by_curve_name()`函数创建一个新的EC_KEY对象。
3. 使用gmssl的`d2i_ECPrivateKey()`函数将PEM或DER格式的私钥数据加载到EC_KEY对象中。
以下是一个将字符串类型私钥转换成EC_KEY对象的示例代码:
```c
#include <openssl/ec.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <stdlib.h>
#include <string.h>
EC_KEY* str_to_ec_key(const char* pri_key_str, size_t len) {
// 将字符串类型私钥转换成bytes类型
unsigned char* pri_key_bytes = (unsigned char*)malloc(len / 2);
for (size_t i = 0; i < len; i += 2) {
char buf[3] = { pri_key_str[i], pri_key_str[i + 1], '\0' };
pri_key_bytes[i / 2] = strtol(buf, NULL, 16);
}
// 创建EC_KEY对象
EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_sm2);
// 将私钥数据加载到EC_KEY对象中
const unsigned char* p = pri_key_bytes;
d2i_ECPrivateKey(&ec_key, &p, len / 2);
// 释放内存
free(pri_key_bytes);
return ec_key;
}
```
在以上代码中,我们首先将字符串类型的私钥转换成bytes类型,并使用`EC_KEY_new_by_curve_name()`函数创建了一个新的EC_KEY对象。然后,我们使用`d2i_ECPrivateKey()`函数将PEM或DER格式的私钥数据加载到EC_KEY对象中。最终,我们返回了加载后的EC_KEY对象,你可以使用该对象进行加密、签名等操作。
阅读全文