C#中的RSA加密:什么部分定义了公钥?

Mik*_*ike 9 .net c# cryptography rsa public-key-encryption

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

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048);  
string publicPrivateKey = RSA.ToXmlString(true);
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

jas*_*son 5

指数和模数定义公钥。

\n\n

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

\n\n
<RSAKeyValue>\n   <Modulus>\xe2\x80\xa6</Modulus>\n   <Exponent>\xe2\x80\xa6</Exponent>\n</RSAKeyValue>\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出。

\n


VMA*_*Atm 3

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

在此输入图像描述

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

string publicPrivateKey = RSA.ToXmlString(false);
Run Code Online (Sandbox Code Playgroud)

结果会是这样的:

<RSAKeyValue>
   <Modulus>t6tLd1Wi7PEkwPfx9KGP1Ps/5F2saXnOsCE2U....</Modulus>
   <Exponent>AQAB</Exponent>
</RSAKeyValue>
Run Code Online (Sandbox Code Playgroud)

您可能想通过其他方获取其他格式的密钥:

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

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

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

  • 好,谢谢。那么我可以将此 XML ( RSA.ToXmlString(false); ) 发送给开发人员,他们将能够用它在 PHP、JAVA 等中加密数据吗? (2认同)
  • @Mike根据系统的不同,他们可能只需要两个数字,或者像我提供的图片中的散列,或者其他东西。您应该联系您的合作伙伴并亲自询问他们。是的,我的意思只是 RSA 公钥格式,而不是其他格式,例如证书之类的。对不起我的英语,我正在努力提高它。 (2认同)