使用OpenSSL生成RSA密钥并加密数据适配老旧嵌入式系统问题咨询
问题解决:OpenSSL 3.0生成RSA密钥对加密后嵌入式老库解密失败
核心问题分析
- 你遇到的
RSA_padding_check_PKCS1_type_1: invalid padding错误,本质是加密时使用的padding类型与嵌入式代码硬编码的RSA_PKCS1_PADDING不匹配:- 嵌入式代码的
RSA_public_decrypt()用RSA_PKCS1_PADDING对应PKCS#1 v1.5的加密padding(Type 2),适配私钥加密、公钥解密的场景。 - 你之前尝试的签名命令(如
openssl dgst -sign)是对明文哈希用PKCS#1 v1.5的签名padding(Type 1)加密,因此解密时触发padding校验失败。
- 嵌入式代码的
- OpenSSL 3.0命令行默认行为与老旧库存在兼容差异,需明确指定padding参数才能生成匹配的数据。
解决方案1:调整OpenSSL命令生成兼容加密数据
步骤1:生成8K RSA密钥对(兼容老旧库的PKCS#1格式)
# 生成PKCS#1格式私钥(老库默认支持) openssl genrsa -out private_key.pem 8192 # 导出公钥 openssl rsa -in private_key.pem -pubout -out public_key.pem
步骤2:用私钥加密明文(指定PKCS#1 Type 2 padding)
使用pkeyutl命令明确指定padding类型,确保与嵌入式代码的RSA_PKCS1_PADDING匹配:
# 私钥加密明文,输出二进制加密文件 openssl pkeyutl -encrypt -in plaintext.txt -out encrypted.bin -inkey private_key.pem -pkeyopt rsa_padding_mode:pkcs1 -pkeyopt rsa_padding_type:2
注意:8K RSA的最大明文长度为
8192/8 - 11 = 1013字节,超过此长度需分段加密或改用对称加密+RSA加密密钥的混合方案。
步骤3:验证加密结果(用公钥解密)
# 公钥解密验证 openssl pkeyutl -decrypt -in encrypted.bin -out decrypted.txt -inkey public_key.pem -pubin -pkeyopt rsa_padding_mode:pkcs1 -pkeyopt rsa_padding_type:2
对比decrypted.txt与原plaintext.txt,确认内容一致即可。
解决方案2:修改嵌入式代码的padding类型(可选)
若无法调整命令行,可修改嵌入式代码的padding参数适配现有加密方式:
- 若之前用签名命令(
openssl dgst -sign)生成数据,需将padding改为**RSA_PKCS1_PADDING并调用RSA_verify()**(而非RSA_public_decrypt()),老旧OpenSSL中RSA_PKCS1_PADDING在签名场景下自动对应Type 1,需测试验证。 - 可选的6种padding类型对应场景:
RSA_PKCS1_PADDING:PKCS#1 v1.5加密/解密(Type 2)、签名/验证(Type 1),兼容你的原场景。RSA_SSLV23_PADDING:SSL v2.3兼容padding,适用于加密场景。RSA_NO_PADDING:无填充,需手动处理数据长度。RSA_PKCS1_OAEP_PADDING:PKCS#1 OAEP填充,安全性更高,但老库可能不支持。RSA_X931_PADDING:X9.31标准填充,适用于签名场景。RSA_PKCS1_PSS_PADDING:PKCS#1 PSS填充,现代签名标准,老库大概率不支持。
内容的提问来源于stack exchange,提问作者RickyBobby
相关产品推荐
相关产品推荐

