C#健壮密钥对匹配

问题描述 投票:0回答:1

我正在以这种方式生成密钥对

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>

如您所见,如果仅考虑模数和指数,则此私钥与公钥(!)匹配。

考虑到用公共密钥加密文本,然后用私有密钥解密文本,很明显,没有人可以使用此伪造的密钥解密消息。因此,像这样的伪造钥匙是没有用的。

我只是想知道,对于健壮的密钥对匹配是否还有其他事情要做。

c# key rsa encryption-asymmetric robust
1个回答
0
投票

@@ JamesKPolk想象一个场景,其中服务器包含所有公共密钥。

[要检查两个密钥是否匹配,我使用用户的公共密钥来加密随机选择的单词的哈希值

我将加密的哈希发送给客户端

客户端使用他的私钥解密哈希

客户端将解密的哈希发送到服务器

如果散列与最初使用的散列相同,并且我多次重复证明,则我们有一个密钥匹配。

在客户端,我也可以按照您建议的方式检查私钥的一致性。

© www.soinside.com 2019 - 2024. All rights reserved.