2017-02-01 1 views
5

Une question difficile, mais je pourrais utiliser toute aide à ce sujet. J'utilise System.Security.Cryptography.Xml à mon extrémité pour chiffrer un blob SAML XML.Le cryptage du système .NET vers le décryptage Java Bouncy Castle génère une erreur

Le cryptage fonctionne bien, mais quand il frappe la bibliothèque java de l'autre côté, ils obtiennent l'erreur:

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) 

Comment puis-je continuer à utiliser ma méthode de cryptage:

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

En contournant cette erreur? Y at-il un paramètre sur EncryptedKey pour définir la taille de remplissage? Ou dois-je utiliser Bouncy Castle pour spécifier la taille des données cryptées?

+0

Il semble que vous utilisiez un cert pour un plus grand module RSA pour le cryptage que pour le décryptage. – bartonjs

+0

alors ce sont les certs qui ne correspondent pas? non je ne suis pas positif Je ne sais pas quel certifcate ils utilisent ... devrait être la clé privée du public correspondant que j'ai été envoyé –

+0

Utiliser la taille spécifiée Château gonflable. – MMK

Répondre

0

J'ai changé la taille du fichier keywrapurl pour le chiffrement AES de la clé RSA. Je ne comprends toujours pas comment fonctionne le cryptage de la librairie opensaml java, et après l'avoir ouvert, je suis étonné de voir combien de temps il faut pour configurer un environnement de test simple en Java.

Morale de l'histoire: n'utilisez pas le cryptage asymétrique pour beaucoup de données. Etes-vous sûr que vous utilisez le CERT correspondant de l'autre côté?

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