RSA六角键到PEM格式

时间:2010-10-05 16:43:40

标签: c openssl key rsa

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

N:C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3

e:10001

p:D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A0BC18F5

q:E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F60BEF2AD7647

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

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

任何建议或任何示例代码?

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

非常感谢, 安德烈

3 个答案:

答案 0 :(得分: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,以确保你做对了。

答案 1 :(得分:0)

openssl / pem.h具有以下用于读/写RSA密钥的函数(来自文件) PEM_write_RSAPrivateKey PEM_read_PrivateKey

PEM_write_RSAPublicKey PEM_read_RSAPublicKey

如果仍然不清楚如何使用它们只是问。我将为您提供一些例子: - )

答案 2 :(得分:0)

这是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>Q,否则密钥将被拒绝。但是,我使用Delphi(TPLockBox 2.0)的工具并不关心它。

注意上面的XML十六进制数字是大端,并且看着你的P和Q键,看到你可能遇到麻烦,因为D9<E2,所以P<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)

希望像我这样在我寻找整个过程时出汗的所有新手都有帮助。