EVP_PKEY与EC_KEY如何相互转换
时间: 2023-08-02 16:06:15 浏览: 789
在OpenSSL库中,可以使用以下函数将EVP_PKEY对象转换为EC_KEY对象:
```c
EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey);
```
该函数返回一个新分配的EC_KEY对象,该对象包含与给定的EVP_PKEY对象相关联的EC密钥。如果pkey不是EC密钥,则返回NULL。
同样地,可以使用以下函数将EC_KEY对象转换为EVP_PKEY对象:
```c
EVP_PKEY *EVP_PKEY_new();
int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key);
```
其中,EVP_PKEY_new()函数用于创建一个新的EVP_PKEY对象,而EVP_PKEY_set1_EC_KEY()函数将EC_KEY对象key关联到EVP_PKEY对象pkey中。
需要注意的是,这两个函数都是一次性的,即它们都会在转换完成后释放原始对象。如果需要在转换后继续使用原始对象,请先对其进行引用计数,以避免意外释放。例如,可以使用以下函数对EVP_PKEY对象进行引用计数:
```c
int EVP_PKEY_up_ref(EVP_PKEY *pkey);
```
该函数将EVP_PKEY对象pkey的引用计数增加1。在完成对EVP_PKEY对象的使用后,应该使用以下函数对其进行释放:
```c
void EVP_PKEY_free(EVP_PKEY *pkey);
```
该函数释放EVP_PKEY对象pkey及其关联的资源。
相关问题
EVP_PKEY 和 EC_KEY 区别
EVP_PKEY和EC_KEY都是OpenSSL中的密钥结构体,但它们的作用不同。
EC_KEY是一种用于椭圆曲线加密的密钥结构体,它包含了公钥和私钥,并提供了一些用于加密、签名、验证等操作的函数。EC_KEY可以使用gmssl等库进行创建和管理。
而EVP_PKEY是一种通用的密钥结构体,可以用于不同类型的加密算法,例如RSA、DSA、ECC等。EVP_PKEY包含了一个指针,指向特定类型的密钥结构体,例如EC_KEY。使用EVP_PKEY可以方便地进行密钥的读取、存储、转换等操作。
因此,如果你需要进行椭圆曲线加密相关操作,可以使用EC_KEY;如果你需要一个通用的密钥结构体,可以使用EVP_PKEY。在一些情况下,EVP_PKEY也可以用来包装EC_KEY密钥,以方便管理和转换。
bool verifyText(std::string text, EVP_key pub, unsigned char sign[SIGN_LEN]) { if(DEBUG) { std::cout << KCYN << "verifying text using EC" << KNRM << std::endl; } unsigned int signLen = SIGN_LEN; unsigned char hash[SHA256_DIGEST_LENGTH]; if(!SHA256 ((const unsigned char *)text.c_str(), text.size(), hash)) { std::cout << KCYN << "SHA1 failed" << KNRM << std::endl; exit(0); } // setting up context EVP_PKEY_CTX * key_ctx = EVP_PKEY_CTX_new(pub,NULL); EVP_PKEY_verify_init(key_ctx); EVP_PKEY_CTX_set_signature_md(key_ctx, EVP_sha256()); bool b = EVP_PKEY_verify(key_ctx, sign, signLen, hash, SHA256_DIGEST_LENGTH); EVP_PKEY_CTX_free(key_ctx); return b; }
这段代码定义了一个名为verifyText的函数,用于验证文本的签名是否有效。函数接受三个参数:一个字符串text,一个EVP_key结构体pub和一个unsigned char数组sign。
函数内部首先检查是否定义了DEBUG宏。如果定义了DEBUG宏,将打印一条信息"verifying text using EC"。
接下来,函数声明了两个变量:signLen用于存储签名的长度,hash用于存储对文本进行SHA256哈希后的结果。
然后,函数使用SHA256函数对text进行哈希,并将结果存储在hash数组中。如果SHA256函数调用失败,将打印错误信息并退出程序。
接着,函数设置上下文,并使用EVP_PKEY_verify_init函数初始化验证操作。然后使用EVP_PKEY_CTX_set_signature_md函数设置签名算法为EVP_sha256()。
接下来,函数调用EVP_PKEY_verify函数来验证签名。该函数返回一个布尔值,表示验证结果。如果验证成功,则返回true,否则返回false。
最后,函数使用EVP_PKEY_CTX_free函数释放上下文,并返回验证结果。
阅读全文