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

