【问题标题】:RSA encryption in C#: What part defines the public key?C# 中的 RSA 加密:哪部分定义了公钥?
【发布时间】:2011-10-01 23:07:15
【问题描述】:

我生成了一个新的公钥/私钥对并将其导出为 XML 字符串:

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048);  
string publicPrivateKey = RSA.ToXmlString(true);

publicPrivateKey 中的 XML 字符串如下所示(为了便于阅读,字符串被缩短):

<RSAKeyValue>
   <Modulus>t6tLd1Wi7PEkwPfx9KGP1Ps/5F2saXnOsCE2U....</Modulus>
   <Exponent>AQAB</Exponent>
   <P>3LJ5y4Vla7cS3XgmbIH5dQgppUHa+aSWavEOCbDRS/M....</P>
   <Q>1QyGIAnjv4YLcRVdwXtxWkijc+aZ496qIBZnCAUUD/E....</Q>
   <DP>0821dc0f+LBKOqIEvj4+2kJrNV5ueQesFBYkEsjPFM....</DP>
   <DQ>ugSzX2oDJwjdGKG1OOiVcmUWAm6IU4PpOxcUYtY8TC....</DQ>
   <InverseQ>LDQIQu+LSB6CSZBrGxNQthWi9mkuPGVZyDDr....</InverseQ>
   <D>qZm2bXKH8WwbsJ8ZlT3S1TbgUifppLrqSRkb8XqEcMv....</D> 
</RSAKeyValue>

生成的公钥应该在其他应用程序(PHP / JavaScript / JAVA)中用于加密数据。上述 XML 的哪一部分定义了公钥/我必须将哪一部分发送给其他应用程序的开发人员?

另一方面:什么定义了私钥/我必须存储哪些部分才能解密由我的公钥加密的数据?

【问题讨论】:

    标签: c# .net cryptography rsa public-key-encryption


    【解决方案1】:

    其他方的 RSA 密钥在 .NET 中生成起来很复杂。如果您向他们发送此 XML,则并非您的所有合作伙伴都能够使用它。公钥的一般格式是这样的:

    您提供的 xml 是私钥。要生成公钥,您应该使用

    string publicPrivateKey = RSA.ToXmlString(false);
    

    结果会是这样的:

    <RSAKeyValue>
       <Modulus>t6tLd1Wi7PEkwPfx9KGP1Ps/5F2saXnOsCE2U....</Modulus>
       <Exponent>AQAB</Exponent>
    </RSAKeyValue>
    

    您可能希望使用其他方来获取其他格式的密钥:

    http://www.codeproject.com/KB/security/RSACryptoPad.aspx

    要将 Java 密钥移植到 .NET 格式,您可以使用此项目:

    http://www.codeproject.com/KB/security/porting_java_public_key.aspx

    【讨论】:

    • 我想你的意思是.ToXmlString(false)msdn.microsoft.com/en-us/library/… 表示 bool 是 includePrivateParameters。
    • 好的,谢谢。所以我可以将此 XML ( RSA.ToXmlString(false); ) 发送给开发人员,他们将能够用它在 PHP、JAVA 等中加密数据?
    • @Mike 好吧,在理想情况下是这样 :) 但是您应该向他们询问他们需要您提供的公钥格式,并以这种格式提供密钥。使用答案中的链接,使用它们很容易重新生成公钥。
    • @VMAtn 感谢您的回答和链接。您认为将公钥存储在 X.509 证书中会更好吗?
    • @Mike 根据系统的不同,他们可能只需要两个数字,或者像我提供的图片中的哈希值,或者其他东西。您应该联系您的合作伙伴并亲自询问他们。是的,我的意思只是 RSA 公钥格式,而不是证书之类的其他格式。对不起我的英语,我正在努力提高它。
    【解决方案2】:

    指数和模数定义公钥。

    如果您使用RSA.ToXmlString 并将其唯一参数includePrivateParameters 设置为false,您将只能看到格式

    <RSAKeyValue>
       <Modulus>…</Modulus>
       <Exponent>…</Exponent>
    </RSAKeyValue>
    

    输出。

    【讨论】:

    • @Json:这意味着我必须将两个字符串、模数和指数都发送给开发人员?所以公钥总是由两个单独的字符串组成,对吗?
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2011-11-07
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2011-11-10
    相关资源
    最近更新 更多