Надежное совпадение пары ключей C#

Я создаю пару ключей таким образом

var rsa = new RSACryptoServiceProvider();
_privateKey = rsa.ToXmlString(true);
_publicKey = rsa.ToXmlString(false);

Если мы сделаем простой Console.Write(_publicKey), у нас будет

    <RSAKeyValue>
      <Modulus>nW/DERb839Z6fM594Eg3Y3AnpEKjMP/QzGn/iJW9snGkIl3crsa6a+g8S7uKNM0rBNoIdYnMlJTRDoPBpl35eO+ad/V0K9CJ+AqAo4q2pVEsJJujjhNX0C6wwrocS5vGWnuX02JZzVwiQxailo0qdq0qYLhp2ckQLUfwGxWr1mU=</Modulus>
      <Exponent>AQAB</Exponent>
    </RSAKeyValue>

Если мы сделаем простой Console.Write(_privateKey)

    <RSAKeyValue>
      <Modulus>nW/DERb839Z6fM594Eg3Y3AnpEKjMP/QzGn/iJW9snGkIl3crsa6a+g8S7uKNM0rBNoIdYnMlJTRDoPBpl35eO+ad/V0K9CJ+AqAo4q2pVEsJJujjhNX0C6wwrocS5vGWnuX02JZzVwiQxailo0qdq0qYLhp2ckQLUfwGxWr1mU=</Modulus>
      <Exponent>AQAB</Exponent>
      <P>wrI5ll8sm45OI+jGNVombQB9YUMMzlHgiP//q8N6shYDkmaGrijYrM0/xm9mXn8sxTvg+jX55159Mpuk1rIiBw==</P>
      <Q>zwIriOVyG45A3i3UHQt+KijTz1kSw+m03Fbw3WDbh2ooYewCvLoLFWCsgk1TeXfMK5u7dLdttgGqC27qd6i5Mw==</Q>
      <DP>JL4dwBMWCAVDGePEBC2PMuL0xnYw5H7vMOufBHtPnGwrIGXY5OUwfuv9LSW42/yEJnS2cIHfN5rNZc+ZvCrB4Q==</DP>
      <DQ>aL53WtCGeWz0Y7easYukLh70deFjPmBd1HPlco7U5eMQReQOyoH0o7+D6nbH+xlj5Njq9DbwO30CFsDrwNpNww==</DQ>
      <InverseQ>OV9TPLS5fli7K59hGH1m5ZnTT80UY9XJzKRFRjWuDHI1P7QL+d6+1d08DAICDWTu6ac/1jD8ibmO6AxOmYw6OQ==</InverseQ>
      <D>kiQjm+KN2645R09as2311F1Qvv6Ig7yDcqzWYlA1pcYtiSU97BNXC0GpbtdohHkK/Nbz0T+X4zh9Ew8lHCzRnIdSQZwGyeCXmk8QNvzK3HTOmLgaTu6UaNFtilqgYWzXHuu8WtvWyyN5F3bLb+PYJ1hAMCrS1RxOqlxXczgSqQU=</D>
    </RSAKeyValue>

Я хочу проверить, совпадают ли два ключа, сгенерированные и сохраненные.

Как мы знаем, любой имеет доступ к открытому ключу.

ftp://ftp.rsasecurity.com/pub/ pkcs/pkcs-1/pkcs-1v2-1.pdf

Для того, что я прочитал, чтобы проверить, являются ли закрытый и открытый ключ одной и той же парой, мы проверяем, что модуль одинаков и что показатель степени открытого ключа равен PublicExponent закрытого ключа.

Если я возьму открытый ключ и сделаю:

    <RSAKeyValue>
      <Modulus>nW/DERb839Z6fM594Eg3Y3AnpEKjMP/QzGn/iJW9snGkIl3crsa6a+g8S7uKNM0rBNoIdYnMlJTRDoPBpl35eO+ad/V0K9CJ+AqAo4q2pVEsJJujjhNX0C6wwrocS5vGWnuX02JZzVwiQxailo0qdq0qYLhp2ckQLUfwGxWr1mU=</Modulus>
      <Exponent>AQAB</Exponent>
      <P>Hi-guys==</P>
      <Q>Im-doing-something-nasty==</Q>
      <DP>to-pass==</DP>
      <DQ>the-key-check==</DQ>
      <InverseQ>XXXXXXXXXXXXXXXX==</InverseQ>
      <D>YYYYYYYYYYYYYYYYYYYYYYYYY=</D>
    </RSAKeyValue>

Как видите, если учитывать только модуль и показатель степени, этот закрытый ключ совпадает с открытым ключом (!).

Учитывая, что текст шифруется с помощью открытого ключа, а расшифровывается с помощью закрытого ключа, становится ясно, что никто не может расшифровать сообщение с помощью этого поддельного ключа. Так что такой поддельный ключ бесполезен.

Мне просто интересно, есть ли что-то еще, чтобы сделать надежное совпадение пары ключей.


person Francesco    schedule 11.10.2019    source источник
comment
Не уверен, что понимаю проблему (или вариант использования, если на то пошло). Зачем вам подделывать свой закрытый ключ? Как кто-то другой мог бы подделать ваш закрытый ключ (по какой-то причине он должен оставаться закрытым)? -- Кстати. модуль вашего примера открытого ключа не соответствует модулю примера(ов) закрытого ключа. Открытый ключ должен быть закрытым ключом без личной информации, верно?   -  person Corak    schedule 11.10.2019
comment
Вы можете хешировать закрытый ключ и сравнивать хэши... но если кто-то может подделать/изменить ваш закрытый ключ, он, вероятно, также сможет изменить хеш... Итак, еще раз, в каком сценарии кто-то имеет доступ к изменению/подделке ваш закрытый ключ?   -  person Corak    schedule 11.10.2019
comment
Ваш вопрос не ясен, и мне кажется, что вы не понимаете, как работает RSA. XML-файл, который вы отправили, неверен, модуль закрытого и открытого ключа должен быть одинаковым.   -  person    schedule 11.10.2019
comment
Как вы заметили, проверить, совпадают ли открытые и закрытые ключи в формате XML, несложно. Проверить правильность закрытого ключа также легко, но довольно утомительно. Просто посмотрите на определение компонентов и проверьте, что p*q = модуль, 1‹p‹модуль и так далее для каждого компонента. Но учтите, что на практике этого никогда не должно происходить.   -  person President James K. Polk    schedule 11.10.2019
comment
никто не может расшифровать сообщение этим поддельным ключом. Так что такой поддельный ключ бесполезен. -- Это похоже на преднамеренное поведение.   -  person Corak    schedule 11.10.2019


Ответы (1)


@JamesKPolk Представьте себе сценарий, в котором сервер содержит все открытые ключи.

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

Сервер отправляет зашифрованный хэш клиенту

Клиент расшифровывает хэш своим закрытым ключом

Клиент отправляет расшифрованный хеш на сервер

Если хэш тот же, что использовался изначально, и мы повторяем доказательство несколько раз, у нас есть ключевое совпадение.

На стороне клиента я также могу проверить согласованность закрытого ключа, как вы предложили.

person Francesco    schedule 11.10.2019