14

我有两个 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>

我正在使用xmlseclibsRobert Richards 的库,它需要密钥的 .PEM 表示来加密和解密事物。

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

谢谢!

4

7 回答 7

10

我找到了一个可以做到这一点的Java 实用程序。

于 2010-06-23T14:47:27.293 回答
2

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

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

我满意的最终解决方案:

  1. java XMLSec2PEM my.xml > 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
于 2013-11-20T16:10:29.873 回答
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 服务。

于 2021-12-02T23:43:37.233 回答
0

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

但是链接已经改变,现在可以从这里获得

于 2011-07-15T22:46:15.167 回答
0

由于 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

于 2014-06-18T13:52:50.563 回答
0

这是一个将 RSA 转换为 pem 的 ruby​​ 版本脚本,反之亦然。

  1. 确保已安装 Ruby。

  2. 在终端中启动 irb

    > irb
    
  3. 将以下代码粘贴到 irb 控制台。

    require 'openssl'
    require 'base64'
    require 'rexml/document'
    
    class PKeyRSAConverter
      def initialize(from_pem:nil, from_xml:nil)
        @from_pem = from_pem
        @from_xml = from_xml
      end
    
      def to_xml
        xml  = '<RSAKeyValue>'
        xml += "<Modulus>#{xml_base64(xml_pkey.n)}</Modulus>"
        xml += "<Exponent>#{xml_base64(xml_pkey.e)}</Exponent>"
        xml += '</RSAKeyValue>'
        xml
      end
    
      def to_pem
        pem_key.to_pem
      end
    
      private
    
      def pem_key
        exponent = xml_find_exponent.to_s
        modulus = xml_find_modulus.to_s
        key = OpenSSL::PKey::RSA.new
        key.set_key(pem_base64(modulus), pem_base64(exponent), nil)
        key
      end
    
      def xml_find_modulus
        REXML::XPath.match(xml_document.root, "//RSAKeyValue/Modulus/text()")[0]
      end
    
      def xml_find_exponent
        REXML::XPath.match(xml_document.root, "//RSAKeyValue/Exponent/text()")[0]
      end
    
      def xml_document
        @xml_document ||= REXML::Document.new(@from_xml.to_s)
      end
    
      def pem_base64(string)
        Base64.urlsafe_decode64(string).bytes.inject(0){|a,e| (a << 8)| e }
      end
    
      def xml_pkey
        @xml_pkey ||= OpenSSL::PKey::RSA.new(@from_pem)
      end
    
      def xml_base64(int)
        Base64.encode64([int.to_s(16).downcase].pack('H*')).split("\n").join
      end
    end
    
  4. pem -> xml

    这是将 PEM 转换为 xml 的示例

    rsa_pem="-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJYOlB8N/EdJL9nqEsRNF+No/9QkmPaX\n/xxpPleZTTNgakTkUlmyZPud8eEGsaX7nLgoVF39zTrXeg4hIeaWsAsCAwEAAQ==\n-----END     PUBLIC KEY-----\n"
    
    puts 'Convert PEM to XML'
    to_xml = PKeyRSAConverter.new(from_pem: rsa_pem).to_xml
    puts to_xml == rsa_xml
    
  5. xml->pem

    这是将 xml 转换为 PEM 的示例

    rsa_xml="<RSAKeyValue><Modulus>lg6UHw38R0kv2eoSxE0X42j/1CSY9pf/HGk+V5lNM2BqRORSWbJk+53x4QaxpfucuChUXf3NOtd6DiEh5pawCw==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"
    
    puts 'Convert XML to PEM'
    to_pem = PKeyRSAConverter.new(from_xml: rsa_xml).to_pem
    puts rsa_pem == to_pem
    

参考

  1. Github 要点:anicet/pkey_rsa_converter.rb
于 2022-02-25T08:48:00.353 回答
-2

找到了这个有用的在线工具RSA Key Converter,它支持

  • XML -> PEM
  • PEM -> XML
于 2013-01-29T06:24:31.090 回答