2017-02-01 3 views
5

Жесткий вопрос, но я мог бы использовать любую помощь на нем..NET Системное шифрование для Bouncy Castle Java Decryption Throws Error

Я использую System.Security.Cryptography.Xml на своем конце для шифрования блога XML SAML.

Шифрование работает отлично, однако, когда он попадает в библиотеку Java с другой стороны они получают сообщение об ошибке:

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) 

Как я могу продолжать использовать мой метод шифрования:

 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; 
    } 

Обходя эту ошибку? Есть ли параметр в EncryptedKey для установки размера заполнения? Или мне нужно использовать Bouncy Castle, чтобы указать размер зашифрованных данных?

+0

Вы уверены, что используете соответствующий сертификат с другой стороны? Похоже, вы используете сертификат для большего модуля RSA для шифрования, чем для дешифрования. – bartonjs

+0

так что это сертификаты, которые не совпадают? нет, я не уверен, что я не знаю, какой сертификат, который они используют ... должен быть закрытым ключом соответствующей публики, который был отправлен. –

+0

Используйте Bouncy Castle указанный размер. – MMK

ответ

0

Я изменил размер keywrapurl для шифрования AES ключа RSA.

По-прежнему не совсем понимаю, как работает шифрование в java-библиотеке opensaml, и после взлома его открывается. Я изумляюсь, сколько времени требуется для настройки простого тестового envrionment в java.

Мораль истории: не используйте асимметричное шифрование для большого количества данных.

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; 
    } 
Смежные вопросы