mbedtls生成一个ecdsa公钥和私钥
时间: 2024-01-14 10:04:17 浏览: 33
在mbedtls中,可以使用以下代码生成一个ECDSA公钥和私钥:
```c
#include <stdio.h>
#include "mbedtls/ecdsa.h"
#include "mbedtls/pk.h"
#include "mbedtls/error.h"
int main(void)
{
int ret = 0;
mbedtls_pk_context key;
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
const char *pers = "ecdsa_genkey";
const mbedtls_ecp_curve_info *curve_info;
mbedtls_ecdsa_context ecdsa;
mbedtls_pk_init(&key);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_entropy_init(&entropy);
mbedtls_ecdsa_init(&ecdsa);
//初始化随机数生成器
ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, strlen(pers));
if (ret != 0) {
mbedtls_printf("mbedtls_ctr_drbg_seed failed: %d\n", ret);
goto exit;
}
//选择椭圆曲线
curve_info = mbedtls_ecp_curve_info_from_name(MBEDTLS_ECP_DP_SECP256R1);
if (curve_info == NULL) {
mbedtls_printf("mbedtls_ecp_curve_info_from_name failed\n");
goto exit;
}
//生成密钥对
ret = mbedtls_pk_setup(&key, mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY));
if (ret != 0) {
mbedtls_printf("mbedtls_pk_setup failed: %d\n", ret);
goto exit;
}
ret = mbedtls_ecp_gen_keypair(&curve_info->grp, mbedtls_pk_ec(key), mbedtls_ctr_drbg_random, &ctr_drbg);
if (ret != 0) {
mbedtls_printf("mbedtls_ecp_gen_keypair failed: %d\n", ret);
goto exit;
}
//获取公钥和私钥
mbedtls_ecdsa_init(&ecdsa);
mbedtls_ecdsa_from_keypair(&ecdsa, mbedtls_pk_ec(key));
//打印公钥和私钥
mbedtls_printf("Private key: ");
for (size_t i = 0; i < mbedtls_pk_ec(key)->d_len; i++) {
mbedtls_printf("%02x", mbedtls_pk_ec(key)->d[i]);
}
mbedtls_printf("\n");
mbedtls_printf("Public key: ");
for (size_t i = 0; i < 2 * curve_info->grp.pbits / 8 + 1; i++) {
mbedtls_printf("%02x", ecdsa.Qp.X.p[i]);
}
for (size_t i = 0; i < 2 * curve_info->grp.pbits / 8 + 1; i++) {
mbedtls_printf("%02x", ecdsa.Qp.Y.p[i]);
}
mbedtls_printf("\n");
exit:
mbedtls_pk_free(&key);
mbedtls_ctr_drbg_free(&ctr_drbg);
mbedtls_entropy_free(&entropy);
mbedtls_ecdsa_free(&ecdsa);
return ret;
}
```
在上面的代码中,使用了SECP256R1椭圆曲线生成密钥对,如果需要使用其他椭圆曲线,可以替换`MBEDTLS_ECP_DP_SECP256R1`和`mbedtls_ecp_curve_info_from_name`中的参数。