C#鲁棒密钥对匹配

C#鲁棒密钥对匹配,c#,key,rsa,encryption-asymmetric,robust,C#,Key,Rsa,Encryption Asymmetric,Robust,我以这种方式生成一个密钥对 var rsa=new RSACryptoServiceProvider(); _privateKey=rsa.ToXmlString(true); _publicKey=rsa.ToXmlString(false); 如果我们做一个简单的控制台。写(_publicKey)我们有 nW/DERb839Z6fM594Eg3Y3AnpEKjMP/QzGn/iJW9snGkIl3crsa6a+g8S7uKNM0rBNoIdYnMlJTRDoPBpl35eO+ad/V0K

我以这种方式生成一个密钥对

var rsa=new RSACryptoServiceProvider();
_privateKey=rsa.ToXmlString(true);
_publicKey=rsa.ToXmlString(false);
如果我们做一个简单的控制台。写(_publicKey)我们有


nW/DERb839Z6fM594Eg3Y3AnpEKjMP/QzGn/iJW9snGkIl3crsa6a+g8S7uKNM0rBNoIdYnMlJTRDoPBpl35eO+ad/V0K9CJ+AQAO4Q2PVESJJJJJHNx0C6WWROCS5VGWNUX02JZVWIQDXAILO0QDQYLHP2CKWGXWR1MU=
AQAB
如果我们做一个简单的Console.Write(_privateKey)


nW/DERb839Z6fM594Eg3Y3AnpEKjMP/QzGn/iJW9snGkIl3crsa6a+g8S7uKNM0rBNoIdYnMlJTRDoPBpl35eO+ad/V0K9CJ+AQAO4Q2PVESJJJJJHNx0C6WWROCS5VGWNUX02JZVWIQDXAILO0QDQYLHP2CKWGXWR1MU=
AQAB

wrI5ll8sm45OI+JGNWOMBBQ9YUMZLHGIP//q8N6shYDkmaGrijYrM0/xm9mXn8sxTvg+JX5559MPUK1RIIBW==

zwIriOVyG45A3i3UHQt+KijTz1kSw+M03FBW3WDBH2OOYEWCVOLFWCSGK1TEXFMK5U7DLDTTGGQC27QD6I5MW== JL4DWBMWCavdgepebc2PMUL0xNYW5H7VMOUFBHTPNGWRIGHXY5OUWFUV9LSW42/yEJnS2cIHfN5rNZc+ZvCrB4Q== AL53WTCGEWZ0Y7EASYKLH70DEFJPMBD1HPLCO7U5EMQREQOYO7+D6nbH+XLJ5NJQ9DBWO30CFSDRWNPWW== OV9TPLS5FLI7K59HGH1M5ZNT80UY9XJZKRFRJWUDHI1P7QL+d6+1D08DAICDWTTU6AC/1jD8ibmO6AxOmYw6OQ== kiQjm+KN2645R09AS2311F1QVV6IG7YDCQZWYLA1CYTISU97BNXC0GPBTDOHKK/Nbz0T+X4ZH9EW8LHCZRNIDSQZWGYECXMK8QNVZK3HTOMLGATU6UANfYWZXHUU8WTVWYYN5F3BLB+PYJ1hAMCrS1RxOqlxXczgSqQU=
我想检查生成并保存的两个键是否匹配

正如我们所知,任何人都可以访问公钥

在我读到的内容中,为了检查私钥和公钥是否属于同一对,我们验证模数是否相同,并且公钥的指数是否等于私钥的公钥指数

如果我使用公钥并执行以下操作:

    <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>

nW/DERb839Z6fM594Eg3Y3AnpEKjMP/QzGn/iJW9snGkIl3crsa6a+g8S7uKNM0rBNoIdYnMlJTRDoPBpl35eO+ad/V0K9CJ+AQAO4Q2PVESJJJJJHNx0C6WWROCS5VGWNUX02JZVWIQDXAILO0QDQYLHP2CKWGXWR1MU=
AQAB

大家好==

我在做一些讨厌的事== 通过== 钥匙检查== XXXXXXXXXXXXXX== YYYYYYYYYYYYYYYYYYYYYYYYYYYY=

如你所见,如果我只考虑模数和指数,这个私钥与公钥(!)/<


考虑到文本是用公钥加密的,而用私钥解密的,显然没有人能用这个伪造密钥解密消息。所以,像这样的伪造钥匙是没用的


我只是想知道,是否还有其他方法可以实现健壮的密钥对匹配。

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

为了检查这两个密钥是否匹配,服务器使用用户的公钥加密随机选择的短语的散列

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

客户端用他的私钥解密散列

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

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


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

不确定我是否理解该问题(或该问题的用例)。你为什么要伪造你的私钥?其他人会如何伪造您的私钥(出于某种原因它应该保持私钥)?——顺便说一句,您的公钥示例的模数与私钥示例的模数不匹配。公钥基本上应该是没有私有信息的私钥,对吗?你可以对私钥进行散列并比较散列。。。但是如果有人可以伪造/修改您的私钥,他们也可能会更改哈希。。。那么,在什么情况下有人可以更改/伪造您的私钥呢?您的问题还不清楚,我觉得您还不清楚RSA是如何工作的。您发送的xml是错误的,私钥和公钥的模数必须相同。如您所述,检查xml格式的公钥和私钥是否“匹配”很容易。检查私钥是否一致和正确也很容易,但相当繁琐。只要看看组件的定义,检查p*q=module,1“没有人能用这个伪造密钥解密消息。所以,像这样的伪造密钥是无用的。”——听起来像是有意的行为。
    <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>
    <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>