2009-10-26 164 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