【问题标题】:RSA hex keys to PEM formatPEM 格式的 RSA 十六进制密钥
【发布时间】:2011-04-21 10:01:25
【问题描述】:

我有关于 n,p,q 的信息,其中 n=pq 和 p 和 q 是用于 RSA 算法的大素数。 例如:

N:C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3 P>

e: 10001

p: D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A0BC18F5

问:E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F60BEF2AD7647

我想根据这些值生成 PEM 私钥和公钥。

我猜它们是十六进制格式,但我真的不知道 pem 格式的密钥中包含哪个。我知道 PEM 只是意味着密钥是 base64 以及一些其他添加页脚(开始公开等)。

有什么建议或示例代码吗?

我的意思是我的目标是从该值中获取两个文件,例如 PEM 私钥和公钥,以传递给 openssl。

非常感谢, 安德烈亚

【问题讨论】:

    标签: c openssl key rsa


    【解决方案1】:

    PEM 编码的 RSA 密钥基本上是采用 PKCS#1 (RFC 3447) 描述的格式的二进制密钥,base-64 编码并由 ASCII 页眉和页脚包围。

    请注意,PKCS#1 格式要求私钥不仅包括 d、e、p 和 q,还包括用于中国剩余定理的其他值(d mod (p-1)、d mod (q-1 ) 和 (q 的倒数) mod p)。如果你知道 p 和 q,这些很容易计算出来。

    如果密钥是加密的,还有更多内容,因为您还应该有一些描述加密的 PEM 标头。

    OpenSSL 源代码中有示例代码(尽管几乎没有评论,而且很难理解)。你最好阅读相关的 RFC,真的,并根据 OpenSSL 检查你的代码,以确保你做对了。

    【讨论】:

      【解决方案2】:

      openssl/pem.h 具有以下功能用于读取/写入 RSA 密钥(从文件) PEM_write_RSAPrivateKey PEM_read_PrivateKey

      PEM_write_RSAPublicKey PEM_read_RSAPublicKey

      如果仍然不清楚如何使用它们,请询问。我会给你举几个例子:-)

      【讨论】:

      • 如果你能提供一些例子,我将不胜感激!非常感谢您的好意。
      【解决方案3】:

      这是 VB.NET 项目中的 RSA 示例。

      第 1 步

      首先,您必须格式化您的 N,E,P,Q,DP,DQ,InverseQ,D 键数据(全部!!见下文) base64 并用它们构建一个 XML 结构化字符串(或文件),如下所示:

      <RSAKeyValue>
      <Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW1Iix</Modulus>
      <Exponent>AQ...</Exponent>
      <P>5w/iuGIBZdTYasdfalksdkkdkdksdldfdfs</P>
      <Q>0ilXTMYjwhp+JvQPo3gnRAF0EgoHPm6tBt1</Q>
      <DP>JS2gLEzQrsLlnlkQCRZ55+RtM6cphJSa5x</DP>
      <DQ>RMWugbsdHHma6phXPcEl6EUpfHW3pSCGko</DQ>
      <InverseQ>h54IMS+ZabAn/WzOFTApgB4y16Az</InverseQ>
      <D>OjnoUo+E02CcU3TBcDFnmlrJ2ORUcXCy5FB</D>
      </RSAKeyValue>
      

      (当然这是假的,不要尝试使用,否则会报错)

      正如 dajames 所说,你还必须有 D,DP,DQ 和 InverseQ。如果你没有它们,事情会变得更复杂但并非不可能,因为你必须自己计算它们。 (对我来说)最简单的方法是访问为我构建 P 和 Q 数字的工具的源代码。在它里面,有一些类可以处理这种大数字。通过稍微修改代码,我可以计算出:

      DP = ( 1 / Exponent) mod ( P - 1 )
      DQ = (1 / Exponent ) mod ( Q - 1 )
      InverseQ = ( 1 / Q ) mod P where P > Q
      

      见最后一行,你必须考虑到标准要求P&gt;Q,否则密钥将被拒绝。但是,我在 Delphi 中使用的工具(TPLockBox 2.0)并不关心它。

      注意上面的 XML 十六进制数字是大端的,注意你的 P 和 Q 键,你会遇到麻烦,因为D9&lt;E2,所以P&lt;Q!!。在任何计算解决它之前交换你的 P 和 Q 数字,如果我是对的(我绝对不确定这一点,有人可以确认吗?Thnx)

      最后,将所有数字转换为base64,构建上述XML结构。

      第 2 步

      使用 BouncyCastle,这更容易。

      下载 BouncyCastle.dll,复制到您的项目文件夹(或任何地方),并将对它的引用添加到您的 VB 项目中;现在您将拥有一个新的“org”命名空间,您可以编写代码:

      Dim r As New RSACryptoServiceProvider()
      ' NOTE: substitute next string with above-like XML,
      ' or load it from a file or what you prefer:
      r.FromXmlString("<RSAKeyValue><Modulus>vbBYUkGHX4YI1Rcovx+Ewz2OW........</RSAKeyValue>")
      Dim key As Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair = Org.BouncyCastle.Security.DotNetUtilities.GetRsaKeyPair(r)
      ' Export to a PEM file:        
      Dim fOut As New IO.StreamWriter("c:\keys.pem", False)
      Dim pw As New Org.BouncyCastle.OpenSsl.PemWriter(fOut)
      pw.WriteObject(key)
      

      希望对所有像我一样在寻找整个过程时流汗的菜鸟有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        相关资源
        最近更新 更多