【问题标题】:How do I convert an XML RSA key to a PEM file?如何将 XML RSA 密钥转换为 PEM 文件?
【发布时间】:2011-03-06 20:55:40
【问题描述】:

我有两个 XML 文件,结构如下:

我的钥匙

<RSAKeyValue>
  <Modulus> ... </Modulus>
  <Exponent> ... </Exponent>
  <P> ... </P>
  <Q> ... </Q>
  <DP> ... </DP>
  <DQ> ... </DQ>
  <InverseQ> ... </InverseQ>
  <D> ... </D>
</RSAKeyValue>

公钥

<RSAKeyValue>
   <Modulus> ... </Modulus>
   <Exponent> ... </Exponent>
</RSAKeyValue>

我正在使用 Robert Richards 的 xmlseclibs 库,它需要密钥的 .PEM 表示形式才能加密和解密。

作为一个加密新手,我不知道从哪里开始,粗略的谷歌搜索并没有发现任何特别明显的东西......

谢谢!

【问题讨论】:

  • xmlseclibs 似乎有一个方法XMLSecurityKey::convertRSA,它接受一个模数和一个指数,并将创建一个 PEM 兼容的公钥。但是,它似乎没有任何方法来创建必要的私钥。有什么帮助吗?
  • 我相信关键格式/演示文稿来自RFC 3275, XML-Signature Syntax and Processing

标签: xml security rsa pem xmlseclibs


【解决方案1】:

我在 python 中的解决方案是这样的:

  1. 从 xml 中提取模数和指数
    xml = etree.fromstring(key_bin)
    modulus = xml.find('Modulus').text
    exponent = xml.find('Exponent').text
    
  2. 在 base64 中对它们进行解码并迭代结果以将其保存为 长度为 2 的字符串:
    mod_b64 = b64decode(modulus.encode())
    exp_b64 = b64decode(exponent.encode())
    exp = ''.join(['{:02x}'.format(x) for x in exp_b64])
    mod = ''.join(['{:02x}'.format(x) for x in mod_b64]) 
    
  3. 将十六进制字符串转换为整数并生成 rsa rsa 库的公钥:
    exp_num = int(exp, 16)
    mod_num = int(mod, 16)
    rsa_key = rsa.PublicKey(mod_num, exp_num)
    
  4. 终于可以加密任何文本:
    msg_cryp = rsa.encrypt(msg.encode('ascii'), rsa_key)
    msg_cryp_str = b64encode(msg_cryp).decode('ascii') 
    

我进行此开发是为了使用一个 Web 服务,该服务要求从 XML 格式的公钥发送加密密码。通过这种方式,我设法加密密码并毫无问题地使用 Web 服务。

【讨论】:

    【解决方案2】:

    我找到了可以做到的Java utility

    【讨论】:

    • 链接已损坏。
    【解决方案3】:

    由于 xmlseclibs 是 PHP,似乎需要另一种 PHP 解决方案。方法如下:

    <?php
    include('Crypt/RSA.php');
    
    $rsa = new Crypt_RSA();
    $rsa->loadKey('<RSAKeyValue>
      <Modulus> ... </Modulus>
      <Exponent> ... </Exponent>
      <P> ... </P>
      <Q> ... </Q>
      <DP> ... </DP>
      <DQ> ... </DQ>
      <InverseQ> ... </InverseQ>
      <D> ... </D>
    </RSAKeyValue>');
    
    $privatekey = $rsa->getPrivateKey();
    $publickey = $rsa->getPublicKey();
    ?>
    

    phpseclib 内置了对 XML 密钥、PuTTY 密钥和 PKCS1 密钥的支持。它会自动检测格式并加载它,如果没有提供参数,getPrivateKey / getPublicKey 将默认输出 PKCS1 格式的密钥。更多信息:

    http://phpseclib.sourceforge.net/rsa/examples.html#convert

    【讨论】:

      【解决方案4】:

      对于那些希望生成的 PEM 可以被 BouncyCastle 读取的人:

      1. 使用XMLSec2PEM工具获取pem文件
      2. 将 pem 转换为 pkcs8 并返回 (!)

      我满意的最终解决方案:

      1. java XMLSec2PEM my.xml &gt; my.pem
      2. 手动编辑my.pem
      3. org.bouncycastle.openssl.PEMReader.readObject() 返回null :-(
      4. openssl pkcs8 -topk8 -inform pem -in my.pem -outform pem -nocrypt -out my.pkcs8
      5. openssl pkcs8 -inform pem -nocrypt -in my.pkcs8 -out my.pkcs8.pem
      6. 现在my.pkcs8.pem 可以通过PEMReader 读取

      【讨论】:

        【解决方案5】:

        发现这个有用的在线工具RSA Key Converter,它支持

        • XML -> PEM
        • PEM -> XML

        【讨论】:

        • 切勿使用在线工具获取此类敏感信息。
        • 只能用于公钥。
        • 它可以用于公开的私钥,也可以用于演示。
        【解决方案6】:

        我花了几个小时寻找完全相同的问题。这个 Java 工具完成了这项工作:)

        但链接已更改,现在可以从here获取

        【讨论】:

        • 链接已损坏。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 2011-04-03
        • 1970-01-01
        • 2014-02-06
        • 2015-01-21
        相关资源
        最近更新 更多