2012-01-18 28 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