You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32下mbedtls PK API RSA加密仅支持21字节输入问题

解决RSA加密仅支持21字节输入的问题

核心问题分析

你遇到的0x4080(即MBEDTLS_ERR_RSA_BAD_INPUT_DATA)错误,本质是密钥生成参数错误导致实际生成的是256位RSA密钥,而非预期的2048位:

  • mbedtls_rsa_gen_key函数的第4个参数nbits要求传入密钥的位数,但你传入的pubKeyLen被定义为256(注释错误标注为2048 bits),实际生成了256位密钥。
  • 256位RSA密钥使用PKCS#1 v1.5填充时,最大明文长度为密钥字节数 - 11(32-11=21字节),正好匹配你只能加密21字节以内数据的现象。

修复步骤

1. 修正密钥长度定义

修改CryptographicSettings.cpp,明确区分密钥位数和字节数:

// RSA related
#define RSAPubKeyEXPONENT 65537
#define RSA_KEY_BITS 2048    // 2048位密钥
#define RSA_KEY_BYTES (RSA_KEY_BITS / 8) // 256字节,对应2048位
#define RSA_MAX_INPUT_LEN (RSA_KEY_BYTES - 11) // PKCS#1 v1.5填充下的最大明文长度:256-11=245字节

2. 修正密钥生成代码

在RSACryptographer::generate_key中,将mbedtls_rsa_gen_key的位数参数改为RSA_KEY_BITS:

ret = mbedtls_rsa_gen_key(mbedtls_pk_rsa(RSA_ctx), mbedtls_ctr_drbg_random, &CTR_ctx, RSA_KEY_BITS, RSAPubKeyEXPONENT);

3. (可选)显式指定填充模式(增强代码可读性)

虽然mbedtls_pk_encrypt默认使用PKCS#1 v1.5填充,但显式设置可以避免歧义。在密钥生成后添加填充模式配置:

// 在generate_key函数的return 0之前添加
mbedtls_rsa_set_padding(mbedtls_pk_rsa(RSA_ctx), MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);

验证修复

修改后重新编译运行,2048位密钥将支持最大245字节的明文加密,符合预期的加密长度。


内容的提问来源于stack exchange,提问作者BurgerMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:27:02