2017-02-01 102 views
5

Trudne pytanie, ale mógłbym skorzystać z pomocy na jego temat..NET Szyfrowanie systemu do Bouncy Castle Java Decryption Zgłasza błąd

Używam System.Security.Cryptography.Xml na moim końcu do szyfrowania blobu XML SAML.

Szyfrowanie działa poprawnie, jednak gdy trafi do biblioteki Java z drugiej strony są one coraz błąd:

java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block 
     at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source) 
     at org.bouncycastle.jce.provider.WrapCipherSpi.engineUnwrap(Unknown Source) 
     at javax.crypto.Cipher.unwrap(Unknown Source) 
     at org.apache.xml.security.encryption.XMLCipher.decryptKey(Unknown Source) 
     at org.opensaml.xml.encryption.Decrypter.decryptKey(Decrypter.java:680) 
     at org.opensaml.xml.encryption.Decrypter.decryptKey(Decrypter.java:611) 
     at org.opensaml.xml.encryption.Decrypter.decryptUsingResolvedEncryptedKey(Decrypter.java:761) 
     at org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:512) 
     at org.opensaml.xml.encryption.Decrypter.decryptDataToList(Decrypter.java:439) 
     at org.opensaml.xml.encryption.Decrypter.decryptData(Decrypter.java:400) 
     at org.opensaml.saml2.encryption.Decrypter.decryptData(Decrypter.java:141) 
     at org.opensaml.saml2.encryption.Decrypter.decrypt(Decrypter.java:69) 

Jak mogę nadal korzystać z metody szyfrowania:

 public XmlElement EncryptXml(XmlElement assertion, X509Certificate2 cert) 
    { 
     //cert = new X509Certificate2(@"C:\temp\SEI.cer"); 
     XmlElement returnElement; 
     EncryptedData message = new EncryptedData(); 
     message.Type = "http://www.w3.org/2001/04/xmlenc#Element"; 
     message.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES128KeyWrapUrl); 
     //message.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES128KeyWrapUrl); 
     EncryptedKey key = new EncryptedKey(); 
     key.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url); 
     key.KeyInfo.AddClause(new KeyInfoX509Data(cert)); 

     var rKey = new RijndaelManaged(); 
     rKey.BlockSize = 128; 
     rKey.KeySize = 128; 
     rKey.Padding = PaddingMode.PKCS7; 
     rKey.Mode = CipherMode.CBC; 

     key.CipherData.CipherValue = EncryptedXml.EncryptKey(rKey.Key, (RSA)cert.PublicKey.Key, false); 
     KeyInfoEncryptedKey keyInfo = new KeyInfoEncryptedKey(key); 
     message.KeyInfo.AddClause(keyInfo); 

     message.CipherData.CipherValue = new EncryptedXml().EncryptData(assertion, rKey, false); 
     returnElement = message.GetXml(); 

     Logger("Cert Size: " + System.Text.ASCIIEncoding.Unicode.GetByteCount(cert.ToString())); 

     GetBytesKeyAndData(rKey, assertion.InnerText); 


     return returnElement; 
    } 

Podczas obchodzenia tego błędu? Czy istnieje parametr EncryptedKey do ustawienia rozmiaru dopełnienia? Czy muszę używać Bouncy Castle, aby określić rozmiar zaszyfrowanych danych?

+0

Czy jesteś pewien, że używasz pasującego certyfikatu po drugiej stronie? Wygląda na to, że używasz certyfikatu dla większego modułu RSA do szyfrowania niż do deszyfrowania. – bartonjs

+0

, więc to certyfikaty, które nie pasują do siebie? nie, nie jestem pozytywna Nie wiem, którego certyfikatu używają ... powinien być kluczem prywatnego pasującego odbiorcy, że zostałem wysłany. –

+0

Używaj podanego rozmiaru skoczni. – MMK

Odpowiedz

0

Zmieniłem rozmiar keywrapurl dla szyfrowania AES klucza RSA.

Nadal nie bardzo rozumiem, jak działa szyfrowanie biblioteki java opensaml, a po jej otwarciu jestem zaskoczony, jak długo trwa konfigurowanie prostego środowiska testowego w języku Java.

Morał z historii: nie używaj asymetrycznego szyfrowania dla dużej ilości danych.

public XmlElement EncryptXml(XmlElement assertion, X509Certificate2 cert) 
    { 
     //cert = new X509Certificate2(@"C:\temp\SEI.cer"); 
     XmlElement returnElement; 
     EncryptedData message = new EncryptedData(); 
     message.Type = "http://www.w3.org/2001/04/xmlenc#Element"; 
     message.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256KeyWrapUrl); 
     //message.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES128KeyWrapUrl); 
     EncryptedKey key = new EncryptedKey(); 
     key.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url); 
     key.KeyInfo.AddClause(new KeyInfoX509Data(cert)); 

     var rKey = new RijndaelManaged(); 
     rKey.BlockSize = 128; 
     rKey.KeySize = 128; 
     rKey.Padding = PaddingMode.PKCS7; 
     rKey.Mode = CipherMode.CBC; 

     key.CipherData.CipherValue = EncryptedXml.EncryptKey(rKey.Key, (RSA)cert.PublicKey.Key, false); 
     KeyInfoEncryptedKey keyInfo = new KeyInfoEncryptedKey(key); 
     message.KeyInfo.AddClause(keyInfo); 

     message.CipherData.CipherValue = new EncryptedXml().EncryptData(assertion, rKey, false); 
     returnElement = message.GetXml(); 

     Logger("Cert Size: " + System.Text.ASCIIEncoding.Unicode.GetByteCount(cert.ToString())); 

     GetBytesKeyAndData(rKey, assertion.InnerText); 


     return returnElement; 
    }