2010-10-19 20 views
3

我遇到問題,我們的第三方供應商暗示sso。.NET中的RSA加密 - JAVA中的解密 - > Java引發「模塊不正常」錯誤

java.lang.ArithmeticException:BigInteger的:驗證我的簽名時,他們收到以下錯誤模量並不積極 - 在java.math.BigInteger.modPow(BigInteger.java:1556)

我沒有控制他們的Java代碼。以下是我現在做:

 CspParameters csp = new CspParameters(); 
     csp.KeyNumber = (int)KeyNumber.Signature; 
     using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024, csp)) 
     { 

      File.AppendAllText(path + "PrivateKey.xml", rsa.ToXmlString(true)); 
      File.AppendAllText(path + "PublicKey.xml", rsa.ToXmlString(false)); 
     } 

下面是簽名的代碼:

public string MD5withRSASignature(string encryptedStringToSign) 
    { 

     byte[] signature; 
     using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024)) 
     { 
      XmlDocument xDoc = new XmlDocument(); 
      xDoc.Load(PRIVATE_KEY_PATH); 
      rsa.FromXmlString(xDoc.OuterXml); 
      byte[] bytes = Encoding.UTF8.GetBytes(encryptedStringToSign); 
      signature = rsa.SignData(bytes, new MD5CryptoServiceProvider()); 
     } 

     return Convert.ToBase64String(signature); 
    } 

(是的,我知道

我使用此代碼創建一個密鑰對,在C#私鑰應位於密鑰存儲區中)。

這裏是他們使用的XML轉換鍵代碼(這就是Java)

private static RSAPublicKey ReadXMLKey(String fileName) 
{ 

     DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document document = builder.parse(new File(fileName)); 
     byte[] modBytes = GetBytesFromElement(document, "Modulus"); 
     byte[] expBytes = GetBytesFromElement(document, "Exponent"); 
     RSAPublicKeySpec rsaKeyspec = new RSAPublicKeySpec(new BigInteger(modBytes), new BigInteger(expBytes)); 
     RSAPublicKey key = (RSAPublicKey)KeyFactory.getInstance("RSA").generatePublic(rsaKeyspec); 

     return key; 
     } 

private static byte[] GetBytesFromElement(Document doc, String tag) throws IOException 
{ 
    BASE64Decoder decoder = new BASE64Decoder(); 
    NodeList list = doc.getElementsByTagName(tag); 
    byte[] results = null; 
    if (list.getLength() == 1) 
    { 
     Element item = (Element)list.item(0); 
     Text text = (Text)item.getFirstChild(); 
     results = decoder.decodeBuffer(text.getNodeValue().trim()); 
    } 
    return results; 
} 
+0

你能發佈所有的Java異常堆棧嗎? – andrewmu 2010-10-19 16:58:06

+0

不幸的是我不能。他們拒絕提供。這顯然是來自標準的Java RSA類。 – 2010-10-19 18:27:47

+0

我懇求並掌握了他們的XML密鑰轉換代碼。見上面 – 2010-10-20 13:52:22

回答

4

異常已與RSA公鑰Java的使用做。你的代碼地址沒有一點。 Java方面如何獲得該密鑰,正在使用什麼格式?

可以解釋錯誤的一個常見錯誤是,如果模數被轉換爲字節數組,但是當它需要時不存在前導零字節。基本上,this BigInteger constructor比它最先出現的有點複雜。它旨在與DER編碼的ASN.1整數兼容。其結果是,如果模數的第一個字節b具有高位設置,即128 <= b < 256,則必須預先存儲前導零字節,否則您的模數將被解釋爲負數。爲了簡單起見,您可以始終預先設置一個前導零字節;如果沒有必要,不會有傷害。

+0

我用xml格式生成密鑰併發送。我掌握了他們的代碼,它採用xml格式的密鑰並將其轉換。 BigInteger構造函數是這裏的問題嗎?我將如何能夠在xml密鑰中預先設置一個0字節的模數? (代碼在上面) – 2010-10-20 13:50:25

+0

原來我沒有使用正確的密鑰格式(PKCS#8),只是使用任何.NET吐出。不過謝謝你 - 你指明瞭我的正確方向。 – 2010-10-20 16:23:33