J'ai écrit du code qui a crypté un fichier de configuration XML contenant les informations d'identification de l'utilisateur, ainsi que le code pour déchiffrer ce fichier. Lorsque je lance le chiffrement et le décryptage ensemble sur ma machine locale, cela fonctionne comme prévu. Cependant, lorsque je déploie le programme, avec uniquement le code décrypté, le fichier xml ne décrypte pas. Je reçois une exception cryptographique: Bad Data? Voici mon code:Problème avec le document XML de décryptage
public static void Encrypt(XmlDocument Doc, string ElementToEncrypt, string EncryptionElementID, RSA Alg, string Keyname)
{
if (Doc == null)
throw new ArgumentNullException("Doc");
if (ElementToEncrypt == null)
throw new ArgumentNullException("Element to Encrypt");
if (EncryptionElementID == null)
throw new ArgumentNullException("EncryptionElementID");
if (Alg == null)
throw new ArgumentNullException("ALG");
//specify which xml elements to encrypt
XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementToEncrypt)[0] as XmlElement;
if (elementToEncrypt == null)
throw new XmlException("The specified element was not found");
try
{
//create session key
RijndaelManaged sessionkey = new RijndaelManaged();
sessionkey.KeySize = 256;
//encrypt using Encrypted exml object and hold in byte array
EncryptedXml exml = new EncryptedXml();
byte[] encryptedElement = exml.EncryptData(elementToEncrypt, sessionkey, false);
//Construct an EncryptedData object and populate
// it with the desired encryption information.
EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
edElement.Id = EncryptionElementID;
edElement.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url);
//encrypt the session key and add it encrypted key element
EncryptedKey ek = new EncryptedKey();
byte[] encryptedKey = EncryptedXml.EncryptKey(sessionkey.Key, Alg, false);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
// Create a new DataReference element
// for the KeyInfo element. This optional
// element specifies which EncryptedData
// uses this key. An XML document can have
// multiple EncryptedData elements that use
// different keys.
DataReference dRef = new DataReference();
// Specify the EncryptedData URI.
dRef.Uri = "#" + EncryptionElementID;
//add data reference to encrypted key
ek.AddReference(dRef);
//Add the encrypted key to the
// EncryptedData object.
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
// Create a new KeyInfoName element.
KeyInfoName kin = new KeyInfoName();
// Add the KeyInfoName element to the
// EncryptedKey object.
ek.KeyInfo.AddClause(kin);
// Add the encrypted element data to the
// EncryptedData object.
edElement.CipherData.CipherValue = encryptedElement;
////////////////////////////////////////////////////
// Replace the element from the original XmlDocument
// object with the EncryptedData element.
////////////////////////////////////////////////////
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
}
catch (Exception e)
{
throw e;
}
}
public static string Decrypt()
{
//create XML documentobject and load config file
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.Load("config.xml");
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
//create container for key
CspParameters cspParam = new CspParameters();
cspParam.KeyContainerName = "XML_RSA_FTP_KEY";
cspParam.Flags = CspProviderFlags.UseMachineKeyStore;
//create key and store in container
RSACryptoServiceProvider ftpkey = new RSACryptoServiceProvider(cspParam);
//add keyname mapping qnd decrypt the document
EncryptedXml exml = new EncryptedXml(xmlDoc);
exml.AddKeyNameMapping("ftpkey", ftpkey);
exml.DecryptDocument();
//pass decrypted document to extract credentials method
string details = Extract_Credentials(xmlDoc);
//return decrypted log in details
return details;
}
Toute aide serait appréciée. Merci, Darren
Merci pour la réponse. Je n'ai rien fait avec la clé privée autre que ce qui est dans mon code. C'est la première fois que j'ai utilisé le chiffrement/décryptage et je me bats avec cette dernière partie. Je vous serais reconnaissant si vous pouviez me diriger dans la bonne direction de ce qui doit faire? Fondamentalement, le fichier XMl et le code décrypté seront regroupés dans le cadre d'un système plus grand à 7 sites distants différents. Chaque site doit pouvoir déchiffrer le fichier en utilisant le code. Comment pourrais-je obtenir la clé privée pour eux? Merci encore. –
Vous faites maintenant face au même problème que tous les autres éditeurs de logiciels dans le monde. C'est le dilemme où DRM est sorti: P Je suis vraiment intéressé de voir quelle réponse en ressort. – Adkins
Une façon de le vérifier pour créer un harnais de test tel qu'un formulaire Windows avec une zone de texte et un bouton déchiffrer/chiffrer, cela vous permettra de tester à distance les chiffrements sur le serveur d'une manière facile à tester ... Pas grand chose aider mais pourrait vous diriger dans la bonne direction. – Xander