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
相关产品推荐
相关产品推荐

