2010-10-05 65 views
0

我有关于n,p,q的信息,其中n = pq和p和q是要用于RSA算法的大质数。 例如:RSA十六进制密钥到PEM格式

N:C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3

E:10001

号码:D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A0BC18F5

问:E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09 272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F60BEF2AD7647

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

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

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

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

非常感谢, 安德烈

回答

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,以确保你的答案正确。

0

的OpenSSL/pem.h具有读/下面的函数写RSA密钥(从文件) PEM_write_RSAPrivateKey PEM_read_PrivateKey

PEM_write_RSAPublicKey PEM_read_RSAPublicKey

如果还不清楚如何使用它们只问。我将为您提供几个示例:-)

+0

如果你能为我提供一些例子,我将非常感激!非常感谢您的好意。 – Kerby82 2010-10-15 18:24:10

0

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

STEP 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项目;现在你将有一个新的“组织”的命名空间,你可以编码:

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) 

希望它可以帮助像我所有的菜鸟谁大汗淋漓,像我一样在寻找整个过程。

相关问题