2009-10-20 155 views
0

我得到了一个RSA加密数据并传递给C#的模块。 C#需要根据公钥(64位编码)和传递的令牌对其进行解密。Java加密C#解密

我有令牌,64位编码的公钥,可以帮助我获得样本开始。 我从Java最后知道的是,它正在使用。我已经从Java结束了,并且需要在C#中编写一个解析器来解密这个结果。我将公钥和令牌都作为字符串值。

Cipher cipher = Cipher.getInstance(ALGORITHM); //Algorithm = "RSA" 
    cipher.init(Cipher.DECRYPT_MODE, key); 

感谢

+0

请看我的答案更新。 – erickson 2009-10-20 19:18:10

回答

1

要开始,你需要的私人密钥解密消息。通过“公钥(64位编码)”,我猜你真正拥有的是Base-64 –编码证书,标题行中写着“----- BEGIN CERTIFICATE -----”和一个页脚上写着“----- END CERTIFICATE -----”。

如果这是正确的,您需要找到私钥。这有时存储在PKCS#12格式文件中,扩展名为“.p12”或“.pfx”。如果存储在这样的文件中,则需要密码才能访问私钥。

或者,OpenSSL和其他实用程序使用的私钥文件可以是Base-64编码或二进制。这些有各种扩展名,可能有或没有密码保护。如果您拥有的文件的标题行为“----- BEGIN RSA PRIVATE KEY -----”或“----- BEGIN PRIVATE KEY -----”,那实际上是私钥。

最后,Windows可以将私钥存储在其内部密钥存储中。

当您澄清私钥的位置时,请更新您的问题。


如果在Java端使用私钥,它可能是尝试执行数字签名。虽然我所测试的所有几个Java提供程序在以这种方式使用(ab)时会产生正确的结果,但如果您正在执行签名,则应使用Signature类。 C#代码也应该使用签名对象来“验证”签名。

使用私钥执行加密。由于公钥公钥密钥为public,任何人都可以解密该消息;即该消息不是机密的。公用密钥由收件人用来验证签名的消息。

+0

使用Java端的私钥完成编码。我假设公钥可以在C#中用来解密这个? – bkhanal 2009-10-20 17:53:01

+0

谢谢。所以,鉴于我有公钥(不是证书) - 我想我可以得到它,但代码将证书中的密钥传给我,我从哪里开始? :)... – bkhanal 2009-10-20 19:41:01

1

检查此代码。

public static string Decrypt(string inputText) 
     { 
     RijndaelManaged rijndaelCipher = new RijndaelManaged(); 
     byte[] encryptedData = Convert.FromBase64String(inputText.Replace(" ","+")); 
     PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT); 

     using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16))) 
     { 
      using (MemoryStream memoryStream = new MemoryStream(encryptedData)) 
      { 
      using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) 
      { 
       byte[] plainText = new byte[encryptedData.Length]; 
       int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length); 
       return Encoding.Unicode.GetString(plainText, 0, decryptedCount); 
      } 
      } 
     } 
+0

RijndaelManaged:对我来说看起来像一个不同的算法? – bkhanal 2009-10-20 19:42:42