Ich habe einen Codeblock für Encrypt/Decrypt Streams geschrieben. Der Code funktioniert in meinem lokalen Computer. Aber wenn ich meinen Code auf Web Die Entschlüsselungsfunktionen veröffentlichen wirft „Bad Data“ Ausnahme Hier die meine Encrypton und EntschlüsselungsfunktionenEncryptedXml DecryptDocument-Methode löst "Bad Data" -Ausnahme aus
private static MemoryStream EncryptStream(XmlDocument xmlDoc, XmlElement elementToEncrypt, string password)
{
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = password;
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
RijndaelManaged sessionKey = null;
try
{
if (xmlDoc == null)
throw new ArgumentNullException("xmlDoc");
if (rsaKey == null)
throw new ArgumentNullException("rsaKey");
if (elementToEncrypt == null)
throw new ArgumentNullException("elementToEncrypt");
sessionKey = new RijndaelManaged();
sessionKey.KeySize = 256;
EncryptedXml eXml = new EncryptedXml();
byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, sessionKey, false);
EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
edElement.Id = EncryptionElementID;
edElement.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url);
EncryptedKey ek = new EncryptedKey();
byte[] encryptedKey = EncryptedXml.EncryptKey(sessionKey.Key, rsaKey, false);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
edElement.KeyInfo = new KeyInfo();
KeyInfoName kin = new KeyInfoName();
kin.Value = KeyName;
ek.KeyInfo.AddClause(kin);
edElement.CipherData.CipherValue = encryptedElement;
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
if (sessionKey != null)
{
sessionKey.Clear();
}
rsaKey.Clear();
MemoryStream stream = new MemoryStream();
xmlDoc.Save(stream);
stream.Position = 0;
Encoding encodeing = System.Text.UnicodeEncoding.Default;
return stream;
}
catch (Exception e)
{
if (sessionKey != null)
{
sessionKey.Clear();
}
rsaKey.Clear();
throw (e);
}
}
private static MemoryStream DecryptStream(XmlDocument xmlDoc, string password)
{
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = password;
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
EncryptedXml exml = null;
try
{
if (xmlDoc == null)
throw new ArgumentNullException("xmlDoc");
if (rsaKey == null)
throw new ArgumentNullException("rsaKey");
exml = new EncryptedXml(xmlDoc);
exml.AddKeyNameMapping(KeyName, rsaKey);
exml.DecryptDocument();
rsaKey.Clear();
MemoryStream outStream = new MemoryStream();
xmlDoc.Save(outStream);
outStream.Position = 0;
return outStream;
}
catch (Exception e)
{
rsaKey.Clear();
throw (e);
}
}
die Ausnahme auf geworfen wird „exml.DecryptDocument();“ Linie.
Haben Sie eine Idee über das Problem und die Lösung?
Edit:
in MSDN Seite gibt es Bemerkung, die als
folgt zu verwenden XML-Verschlüsselung mit X.509-Zertifikaten, müssen Sie die Microsoft Verbesserte Der Cryptographic Provider muss installiert sein und das X.509 Zertifikat muss den Enhanced Provider verwenden. Wenn Sie den Microsoft Enhanced Cryptographic Provider nicht installiert haben oder das X.509 -Zertifikat den erweiterten Anbieter nicht verwendet, wird beim Entschlüsseln eines XML-Dokuments eine CryptographicException mit einem "Unbekannten Fehler" ausgelöst.
Haben Sie eine Vorstellung von "Microsoft Enhanced Cryptographic Provider" und "X.509-Zertifikat"? Und kann mein Problem damit verwandt sein?
Welchen Wert hat Ihr KeyName im Web? – Smaug
Ich versuchte das gleiche in meiner Maschine auch ich konnte nicht simulieren. pls teilen den KeyName-Wert – Smaug
KeyName = "rsaKey"; – srcnaks