我有关于n,p,q的信息,其中n = pq,p和q是用于RSA算法的大素数。 例如:
N:C053094BFABF26D431CF33E028770DBB15F4AE76820B5150181F1BF42C5CF3AA7BDB459ACA77D610497F94FFA017BC07EF030E3D3450CAE7E706F352B7D7575CA6B89A5B3C953028E562F7F698C97FDD490EDF4788F073362C743B70AF2C61A17FA495E5801CC8EA1A732C9E8985DB4E8A22EAB97407806F8D7CDDF0BF3CD9F3
e:10001
p:D9CC00CD811FB052A0EF27332597DA89AAA6B042A1A01A8944229EE680C964148BB07AFBD2EBE467CC9B28E41B5897132F9AFDCD7C5B794CD37E3245A0BC18F5
q:E20F35A3B49B49A35DE25E285EE9B2DC5F3B5FDDD281892F4BE3C54768CBE09272667FF137C5ED9CADD42FF18A8B08FFA9A82C0CF26169B0940F60BEF2AD7647
我想从这些值生成PEM私钥和公钥。
我猜它们是十六进制格式,但我真的不知道pem格式的密钥中包含哪个格式。我知道PEM只是意味着密钥是base64,还有一些其他的添加页脚(开始公共等)。
任何建议或任何示例代码?
我的意思是我的目标是从该值获取PEM私钥和公钥中的两个文件,例如传递给openssl。
非常感谢, 安德烈
答案 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)
希望像我这样在我寻找整个过程时出汗的所有新手都有帮助。