Жесткий вопрос, но я мог бы использовать любую помощь на нем..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, чтобы указать размер зашифрованных данных?
Вы уверены, что используете соответствующий сертификат с другой стороны? Похоже, вы используете сертификат для большего модуля RSA для шифрования, чем для дешифрования. – bartonjs
так что это сертификаты, которые не совпадают? нет, я не уверен, что я не знаю, какой сертификат, который они используют ... должен быть закрытым ключом соответствующей публики, который был отправлен. –
Используйте Bouncy Castle указанный размер. – MMK