2012-01-18 54 views
5

我有用于私钥和公钥的AsymmetricKeyParameter对象。什么是最简单的方法来查看它们是否匹配?如何使用(.NET/BouncyCastle)检查私钥/公钥对是否匹配?

我想加密一些文本(私钥)并解密一些文本(公钥)。 到目前为止,我还没有能够做到这一点,但它似乎是错误的方法。

更新:这里是示例代码:

X509Certificate2 c = new X509Certificate2(@"certificate.cer"); 
byte[] privateKeyData = System.IO.File.ReadAllBytes(@"private.key"); 
Org.BouncyCastle.X509.X509Certificate cert = DotNetUtilities.FromX509Certificate(c); 


RsaPrivateCrtKeyParameters privateKey = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(privateKeyData); 
RsaKeyParameters publicKey = (RsaKeyParameters)cert.GetPublicKey(); 

if (privateKey.Modulus.Equals(publicKey.Modulus) && publicKey.Exponent.Equals(privateKey.PublicExponent)) 
{ 
    //they match 
} 
+0

如果您使用公钥进行解密,您是否实际尝试签名数据而不是加密? – weston 2012-01-18 10:03:39

+0

我想匹配键,我只是不知道如何去做。 – 2012-01-18 11:48:33

回答

6

检查私钥和公钥是否匹配的最简单方法是使用公钥对一段数据进行加密,并查看是否可以使用私钥对其进行解密 - 或者也可以使用私钥对数据进行签名私钥,看看你是否可以用公钥验证它。

如果密钥是RSA密钥,你可以投的公钥Org.BouncyCastle.Crypto.Parameters.RSAKeyParameters和私钥Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters并验证Modulus是相同的公共密钥的那Exponent等于私钥PublicExponent。如果你想变得很花哨,你也可以验证私钥的所有其他参数(按照PKCS#1第3.2节)。

+0

谢谢你的伟大答案!我正在使用Exponent和Modulus匹配技术。 – 2012-01-18 12:48:05

+0

Btw你的第一句话没有多大意义。我应该使用public加密并使用PRIVATE解密? – 2012-01-18 12:49:06

+0

@Evgeni Petrov:是的,你是对的。我纠正了这个句子。 – 2012-01-18 12:52:26

0

我试图加密一些文字(私钥)和解密一些文本 (公钥)。

公钥并不打算用于解密。在PKI中,公共密钥由多方共享,以加密它打算发送给私钥持有者的数据,然后私钥用于解密提交的数据。

+3

虽然签名是通过加密用私钥签名的内容的安全哈希来完成的,然后可以通过与公众解密来验证。不过,挑剔的,+1,完全一样。 – 2012-01-18 10:41:40

+0

那么我应该如何检查私钥和公钥是否匹配? – 2012-01-18 11:47:47