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

使用OpenSSL生成RSA密钥并加密数据适配老旧嵌入式系统问题咨询

问题解决:OpenSSL 3.0生成RSA密钥对加密后嵌入式老库解密失败

核心问题分析

  1. 你遇到的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校验失败。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:17:14