Значения ключей RSA и модуль в открытых/закрытых ключах

Я пишу приложение, которое использует PKI для защиты электронной почты, файлов и т. д. Используя пространство имен System.Cryptography, я генерирую новую пару ключей, используя RSACryptoServiceProvider.

Метод:

public static void GenerateKeys(int keySize, out string publicKey, out string privateKey)
{
    using (var provider = new RSACryptoServiceProvider(keySize))
    {
        publicKey = provider.ToXmlString(false);
        privateKey = provider.ToXmlString(true);
    }
}

keySize = 2048.

Это приводит к такому открытому ключу, как (он был обрезан/дополнен обертками «-----START/END PUBLIC KEY BLOCK-----» для аккуратности.

-----START PUBLIC KEY BLOCK-----
<RSAKeyValue><Modulus>xs1GwyPre7/knVd3CAO1pyk++yp/qmBz2TekgrehYT
WU7hs8bUCeVQrL2OB+jm/AgjdPMohWHD/tLcJy35aZgVfPI3Oa3gmXxdoLZrfNRb
nrCm3Xr1MR7wnhMyBt5XXyU/FiF46g5qJ2DUIUg7teoKDNUSAN81JTIoH0KC+rZB
oO3tu9PR7H75K5G2eT6oUWkWKcZZU/4WNCDasNtizTe41Jy99BjrChww5r2ctqG8
LvIv7UeeFaK1vhxGKaNH/7JvKJI9LbewWNtmb/nRzQg9xK3e0OhblbW+o6zg5pTw
+n37fS7pkXK7lbRfUfaQmhoGy6ox4UWGmOgm8yPu8S4Q==</Modulus><Exponen
t>AQAB</Exponent></RSAKeyValue>
-----END PUBLIC KEY BLOCK-----`

Когда я смотрю на открытые (или закрытые) ключи на основе PGP, внутри ключа нет значений <RSAKeyValue>, <Modulus> или <Exponent>.

Я делаю что-то неправильно? Я что-то пропустил? Если я распространяю этот ключ, это проблема безопасности?

Криптовалюта — новая и захватывающая область для меня, поэтому я ДЕЙСТВИТЕЛЬНО признателен за любые советы. Я обеспокоен тем, что облажался - шифрование с помощью ключа работает, а расшифровка с помощью закрытого ключа работает - мне просто интересно, почему ключи PGP/GPG так сильно различаются по внешнему виду и что мне нужно сделать, чтобы исправить это?

Заранее спасибо!


person JDubya13    schedule 17.07.2013    source источник


Ответы (1)


Теги RSAKeyValue, Modulus и Exponent находятся там, потому что вы использовали метод ToXmlString().

Открытый ключ RSA состоит из модуля и открытого показателя степени. При распространении этих двух предметов нет проблем с безопасностью. ОДНАКО, вы НЕ хотите распространять какие-либо другие элементы закрытого ключа. Закрытый ключ имеет следующие поля:

<RSAKeyValue>
   <Modulus>…</Modulus>
   <Exponent>…</Exponent>
   <P>…</P>
   <Q>…</Q>
   <DP>…</DP>
   <DQ>…</DQ>
   <InverseQ>…</InverseQ>
   <D>…</D>
</RSAKeyValue>

Не распространяйте ничего, кроме Modulus и Public Exponent, которые находятся как в закрытом, так и в открытом ключе.

При распространении открытых ключей обычно выдается подписанный сертификат X509, который содержит открытый ключ, идентификационную информацию, связывающую этот ключ с объектом, и подпись доверенного центра.

Если вы выдаете открытый ключ в формате строки XML, получатель должен затем использовать метод FromXmlString() для его использования. Получатель также не может узнать, действительно ли вы отправили открытый ключ, если только вы не дадите его ему лично (или не воспользуетесь методом сертификата, описанным выше).

person gtrig    schedule 18.07.2013
comment
Можете ли вы указать мне ссылку на то, что означает каждое поле? Например, ‹P›, ‹Q› и т. д. Я не могу найти ничего, документирующего, с чем на самом деле соотносятся эти поля. - person Dave Black; 10.12.2019