Надежное совпадение пар ключей C # - PullRequest
0 голосов
/ 11 октября 2019

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

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>

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

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

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

1 Ответ

0 голосов
/ 11 октября 2019

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

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

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

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

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

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

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

...