这是 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)
希望对所有像我一样在寻找整个过程时流汗的菜鸟有所帮助。