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

Mbed TLS中RSA OAEP原地加解密功能异常问题咨询

Mbed TLS RSA OAEP原地加解密异常问题

当在Mbed TLS中使用独立缓冲区分别存储明文、密文和解密文本时,RSA OAEP加解密功能正常,解密后文本与原明文完全一致。但使用单个缓冲区执行原地加解密时,最终得到的是乱码或未正确解密的数据,且函数返回值始终为0(无错误提示),sizeDecrypted仍显示为8(与原明文长度一致)。

根据Mbed TLS相关文档描述:“除非另有说明,Mbed TLS允许原地密码操作”,但不确定该描述是否仅针对AES等对称加密算法,且未发现RSA OAEP加解密有明确禁止原地操作的备注,因此推测该功能应该被支持。

代码示例

size_t sizeDecrypted;
unsigned char plainText[15000] = "yxcvbnm";
unsigned char cipherText[15000];
unsigned char decryptedText[15000];

// 独立缓冲区加解密:正常工作
rtn = mbedtls_rsa_rsaes_oaep_encrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, sizeof("yxcvbnm"), plainText, cipherText);
rtn = mbedtls_rsa_rsaes_oaep_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, &sizeDecrypted, cipherText, decryptedText, 15000);
// decryptedText内容与plainText一致,sizeDecrypted为8(包含字符串末尾的二进制0)

// 单缓冲区原地操作:解密结果异常
unsigned char text[15000] = "yxcvbnm";
rtn = mbedtls_rsa_rsaes_oaep_encrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, sizeof("yxcvbnm"), text, text);
rtn = mbedtls_rsa_rsaes_oaep_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, &sizeDecrypted, text, text, 15000);
// text内容与原plainText不符,rtn为0无错误,sizeDecrypted仍为8

分析与结论

这是RSA OAEP加解密的固有实现限制,并非代码逻辑错误,原因如下:

  • RSA OAEP加密需要先对明文进行填充,填充后的数据长度等于RSA密钥的模长(例如2048位密钥对应256字节),远大于原始明文长度。
  • 当使用原地操作(输入输出缓冲区重叠)时,填充过程会覆盖缓冲区中原始明文的部分区域,导致后续加密步骤无法获取完整的填充后数据,最终生成的密文本身就是错误的。即使解密函数无报错返回,也无法还原出正确的明文。
  • Mbed TLS文档中“允许原地操作”的描述主要针对AES等对称加密算法,这类算法的输入输出长度一致,操作过程不会因缓冲区重叠破坏中间数据。而RSA这类非对称加密算法因输入输出长度差异大、填充逻辑特殊,天然不支持原地操作,即便文档未明确标注该限制。

解决方案

  • 必须使用独立的输入和输出缓冲区执行RSA OAEP加解密操作,严格避免缓冲区重叠。
  • 若需节省内存,可在加密完成后将密文复制到原明文缓冲区,但加密阶段绝对不能直接使用原地操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:22:46