【问题标题】:Read Base64 private key without encapsulation header in OpenSSL在 OpenSSL 中读取没有封装头的 Base64 私钥
【发布时间】:2017-03-21 12:06:36
【问题描述】:

我正在尝试使用带有 openssl 的私钥解密消息。当我使用以下格式的私钥时,我的实现工作正常

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDDEOX/tFJZrgR0dtTN2/jgPAJjWKE68aw8ayYaGn9fo1sJAE3C
uH6Ym3hu775Enfd5DhtJ38g8RCFLzGVP/LW6n4+LsKS5HRZTGcDkpME0sVoLHLZd
w8z4xZe5h+lT0jwkap5BNyHJCSddipxzjQIEtW+w8V6BkKkFw6UYN1Xn5QIDAQAB
AoGAUeS0Ssfvksrl/+crrElfkPRgpEi/V7nCb5Mkae0Z8JLqUzsXalp+e585zolE
PhZ7oQz1E+ypafPIbsQe/JfByx3itUk7J8+bZO4TpE8n5Afz8EdZLIqJU11MoafH
mWYYWsoMdymgxasuu0ygyeswP42/aw1M+qQgoWBSoPtgLrkCQQDsygWQRI868JKJ
OXzeKV6HTKjGXg37Zm050UaPk2a8inGk6F5RqH1+IZ4istrlcJTpJTuQCsVHJ+SQ
nLveL09vAkEA0uRPeSdXbi92AR/5fj2Xh2APerYjRgK11nh4QEiqbmKyNdW7r9zb
tIQiL9f4AXvcwIVnSWVgiTCwWOa9w8lT6wJBAOMlWPjwC8YqiSeCMjqbzMZVz4Gb
MCZ+N0FDdEC+0csDs8jR78i9rMSWUzBOCpYWzYJp6R1gd6auqh/feojFMZkCQQCO
Gkly2Y+QL2rUVzdGWTpBffjwNsqN4kWkvohIyK4Os3Jh1CMj3S4t9NsUYfI7Dbsx
/rIaQrVJvAUX4mL8Ci0BAkEAuAZBSTmd7MQybVlWCP1AVvlMyW1CV/Mts4tLsGO5
NRMuXY0CrQaO69MW4nuHCSmshBcNB7ahGxYYYMaHmem3QQ
-----END RSA PRIVATE KEY-----

当我尝试使用没有封装标头(-----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----)的相同密钥时,它失败了。

这些标头对于键是强制性的吗?

如果我想使用没有标头的密钥,我应该使用 OpenSSL 的哪个 API?

【问题讨论】:

  • 没有其他 API 同样易于使用。为什么这是一个问题?添加或删除页眉和页脚应该很容易。
  • 这不是问题。我的客户会将密钥作为不带标题的输入提供。所以我希望使用任何 API 构建 RSA 结构。我可以执行 strcat() 来包含页眉和页脚。但这看起来有点硬编码,这是检查替代品的原因
  • 参见How to generate RSA private key using openssl? 它提供了有关不同编码格式的信息。简而言之,如果它的 PEM 编码,那么它需要封装头。如果您不想要标题,请使用 ASN.1/DER。您处于一个不寻常的中间地带 - 您想要 Base64 编码的 ASN.1/BER。通常你只使用 PEM。但是可以放弃标头,Base64 解码,然后使用d2i_RSAPrivateKey_bio 读取它。
  • 请注意,您可以对 BIO 进行分层:创建一个读取未标记 base64 的 memBIO,然后创建一个读取该 memBIO 并返回二进制文件的 b64BIO,并从该 b64BIO 读取 d2i。
  • 我不明白为什么这是题外话,除非暗示命令行使用。随意提供比我更好的答案。

标签: encryption openssl cryptography rsa


【解决方案1】:

密钥格式的类型由 PEM 编码密钥的页眉和页脚定义。在内部,它只是一个 PKCS#1 私钥。有关格式的更多信息,您可以查看 this Q/A 或 ASN.1 解码密钥 here

所以虽然所有信息都在base 64编码中,但是中间的实现不一定能直接解析出来,主要是结构的类型是未知的。

但是,您可以对其进行 base 64 解码并将其用作 OpenSSL 中的密钥。在这种情况下,您可能需要指定 -inform DER 或类似名称。

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2018-07-25
    • 2015-11-25
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多