mbedtls rsa签名验签流程
时间: 2025-05-29 20:58:02 AIGC 浏览: 63
### mbedtls RSA 签名与验签流程
mbed TLS 是一个轻量级的加密库,提供了丰富的 API 来实现各种密码学功能。以下是基于 mbed TLS 的 RSA 签名和验签的完整流程描述以及示例代码。
#### 1. 初始化上下文
在使用 mbed TLS 进行 RSA 操作之前,需要初始化 `rsa_context` 结构体。该结构体会保存所有的密钥参数和其他必要的状态信息[^2]。
```c
#include "mbedtls/rsa.h"
#include "mbedtls/md.h"
// 定义并初始化 RSA 上下文
mbedtls_rsa_context rsa;
mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0);
```
#### 2. 导入私钥或公钥
为了执行签名操作,必须导入私钥;而验证签名则需导入对应的公钥。可以通过函数 `mbedtls_rsa_import_raw()` 或者其他类似的接口完成这一过程[^3]。
```c
int ret;
unsigned char N[] = { /* modulus */ };
unsigned char E[] = { /* public exponent */ };
unsigned char D[] = { /* private exponent */ };
size_t n_len = sizeof(N), e_len = sizeof(E), d_len = sizeof(D);
if ((ret = mbedtls_rsa_import_raw(&rsa, N, n_len, NULL, 0, NULL, 0,
NULL, 0, D, d_len)) != 0) {
printf("Failed to import private key! Error code: %d\n", ret);
}
```
如果仅用于验证,则只需提供模数 \(N\) 和指数 \(E\)[^4]:
```c
if ((ret = mbedtls_rsa_import_raw(&rsa, N, n_len, NULL, 0, NULL, 0,
E, e_len, NULL, 0)) != 0) {
printf("Failed to import public key! Error code: %d\n", ret);
}
```
#### 3. 设置填充模式
RSA 签名通常采用 PKCS#1 v1.5 填充方式或者 PSS (Probabilistic Signature Scheme),这一步骤通过调用 `mbedtls_md_type_t` 类型指定哈希算法来设置[^5]。
```c
MBEDTLS_MD_TYPE_SHA256; // 使用 SHA-256 哈希算法
```
对于 PSS 填充,还需要额外配置盐长度等参数[^6]。
#### 4. 执行签名
利用已加载好的私钥对消息摘要进行签名处理。此阶段会生成最终的数字签名数据流[^7]。
```c
const unsigned char message[] = "This is a test message.";
unsigned int hash_length;
unsigned char signature[MBEDTLS_MPI_MAX_SIZE];
// 计算消息散列值
mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
message, strlen((char *)message), buffer, &hash_length);
// 调用签名方法
if ((ret = mbedtls_rsa_rsassa_pkcs1_v15_sign(&rsa, f_rng, p_rng,
MBEDTLS_RSA_PRIVATE,
MBEDTLS_MD_SHA256,
hash_length, buffer, signature))
!= 0) {
printf("Signing failed with error %d.\n", ret);
} else {
printf("Signature generated successfully!\n");
}
```
#### 5. 验证签名
接收方收到原始消息及其对应签名后,可以重新计算相同的消息摘要并与接收到的签名比较确认其真实性[^8]。
```c
if ((ret = mbedtls_rsa_rsassa_pkcs1_v15_verify(&rsa, NULL, NULL,
MBEDTLS_RSA_PUBLIC,
MBEDTLS_MD_SHA256,
hash_length, buffer, signature))
!= 0) {
printf("Verification failed with error %d.\n", ret);
} else {
printf("The signature was verified correctly.\n");
}
```
最后记得释放分配给 `rsa_context` 的资源以防止内存泄漏[^9]:
```c
mbedtls_rsa_free(&rsa);
```
以上即为完整的基于 mbed TLS 实现 RSA 数字签名及验证的过程概述。
阅读全文
相关推荐











