RSA-шифрование в C #: какая часть определяет открытый ключ? - PullRequest
9 голосов
/ 09 июля 2011

Я сгенерировал новую пару открытого / закрытого ключа и экспортировал ее в виде строки XML:

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

Строка XML в publicPrivateKey выглядит следующим образом (строки сокращены для удобства чтения):

<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-кода определяет открытый ключ / какую часть я должен отправить разработчикам других приложений?

И на противоположной стороне: Что определяет закрытый ключ / какую часть / части я долженнужно хранить, чтобы иметь возможность расшифровывать данные, зашифрованные моим открытым ключом?

Ответы [ 2 ]

4 голосов
/ 09 июля 2011

Экспонент и модуль определяют открытый ключ.

Если вы используете RSA.ToXmlString с единственным параметром includePrivateParameters, установленным на false, вы увидите только формат

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

выход.

3 голосов
/ 09 июля 2011

Ключи RSA для других сторон сложно создать в .NET.Если вы отправите им этот XML, не все ваши партнеры смогут его использовать.Общий формат открытого ключа выглядит примерно так:

enter image description here

Полученный вами 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

...