【发布时间】:2017-02-11 01:22:50
【问题描述】:
棘手的问题,但我可以使用任何帮助。
我正在使用 System.Security.Cryptography.Xml 来加密 XML SAML blob。
加密工作正常,但是当它访问另一端的 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 模数。
-
所以是证书不匹配?不,我不确定我不知道他们使用的是哪个证书...应该是我收到的匹配公钥的私钥
-
使用 Bouncy Castle 指定尺寸。
-
您在 Java 端使用 opensaml 库来解密 AES 密钥和 XML 内容,预计可以正常工作。跟踪显示使用 RSA 私钥解密 AES 密钥存在问题。加密数据的大小可能不是问题。正如您所说的密钥对匹配,那么问题出在 C# 方面。我已经查看了使用 AEs 密钥的 XML Dsig 加密的完整示例,但我没有发现实质性差异。 msdn.microsoft.com/en-us/library/ms229746(v=vs.110).aspx(我不是 c# 程序员)你能测试一下
decrypt的例子方法吗?
标签: java c# asp.net encryption bouncycastle