2009-10-26 155 views
6

我正在使用由具有私鑰和公鑰的makecert生成的證書。 java端使用這個公鑰來加密數據,.net解密它。rsacryptoserviceprovider使用x509證書c#

我想解密Java的加密的64位編碼的字符串,並獲取不良的數據。

要查看是否所有的.net結束,我首先嚐試使用公鑰進行加密,然後使用相同的證書與私人解密。我的代碼看起來像這樣。

X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine); 
RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; 

RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; 

if (cert.HasPrivateKey) 
    MessageBox.Show("Got private key"); 

byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false); 
byte[] decryptedBytes = provider.Decrypt(encrypted, false); 

即使在這裏,我得到的錯誤。我失去了什麼?

證書對於公鑰和私鑰都有效。

+0

什麼錯誤?並在什麼線路上? – 2009-10-26 09:29:30

+0

異常:錯誤的數據..沒有進一步的內部異常 當byte [] decryptedBytes = provider.Decrypt(encrypted,false);當證書返回時, 被稱爲 – bkhanal 2009-10-26 14:28:01

回答

1

我終於找到了問題。我沒有把makecert定義爲RSA Crypto密鑰。

4

下面的代碼工作正常,我:

 RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider(); 
     privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>"); 
     RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 
     publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"); 

     { 
      string text = "foo"; 
      byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false); 
      byte[] decryptedBytes = privateKey.Decrypt(encrypted, false); 
     } 

你能仔細檢查導出的私鑰是從cert.PrivateKey和公鑰是由cert.PublicKey.Key?

+0

它已經生成了aes對稱密鑰。 我沒有使用實施,我們必須做 首先創建公共私鑰並基於此生成提供程序。這使用了makecert。 上面的代碼不會給出錯誤,但具有128個字符模數...... – bkhanal 2009-10-26 14:34:17

+1

「當證書返回時它已經生成了aes對稱密鑰。」我真的不明白這意味着什麼。 AES密鑰在哪裏產生?我的代碼示例中看不到它。 – 2009-10-26 19:05:52

+0

如果您使用makecert工具製作證書。它有私鑰和公鑰。所以,你可以去商店拿到私人公鑰。我還沒有把他的代碼拿到私鑰和公鑰 – bkhanal 2009-10-26 22:00:55

4

我有一個自簽名的證書同樣的問題,這個問題是我是與交換機的-sky signature代替-sky exchange生成證書(您使用簽名簽名和交換加密/解密)

這裏是我的全部命令makecert的作品:

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange