2009-10-20 191 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