我正在開發使用.NET3.5(C#)的Winforms應用程序。爲了保護應用程序,我使用了一個Xml文件,該文件應該使用不對稱密鑰進行加密。解密XML文件與不對稱關鍵窗口窗體和窗口服務
現在,我的應用程序有兩部分,windows窗體部分和windows服務部分(誰檢查應用程序的真實性)。所以,我的文件將被這兩部分加密/解密。這就是問題出現的地方。當勝利表單部分嘗試解密已由服務創建的文件時,會發生異常(不正確的數據)。這裏是我的代碼:
private readonly static string containerName = "ENC_XML_ASY_KEY";
private readonly static string keyName = "keyName";
public static void EncryptXmlFile(this XmlDocument doc, string elemToEncryptName)
{
if (doc == null)
return;
var cspParams = new CspParameters() { KeyContainerName = containerName };
var rsaKey = new RSACryptoServiceProvider(cspParams);
var elementToEncrypt = doc.GetElementsByTagName(elemToEncryptName)[0] as XmlElement;
if (elementToEncrypt == null)
return;
// Create a 256 bit Rijndael key.
var sessionKey = new RijndaelManaged() { KeySize = 256 };
var eXml = new EncryptedXml();
byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, sessionKey, false);
var edElement = new EncryptedData()
{
Type = EncryptedXml.XmlEncElementUrl,
Id = "XmlID",
EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url)
};
var ek = new EncryptedKey();
var encryptedKey = EncryptedXml.EncryptKey(sessionKey.Key, rsaKey, false);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
// Create a new KeyInfoName element.
var kin = new KeyInfoName() { Value = keyName };
// Add the KeyInfoName element to the encryptedKey object.
ek.KeyInfo.AddClause(kin);
edElement.CipherData.CipherValue = encryptedElement;
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
}
public static void DecryptXmlFile(this XmlDocument doc)
{
if (doc == null)
return;
var cspParams = new CspParameters() { KeyContainerName = containerName };
var rsaKey = new RSACryptoServiceProvider(cspParams);
var exml = new EncryptedXml(doc);
exml.AddKeyNameMapping(keyName, rsaKey);
exml.DecryptDocument();
}
預先感謝您
執行服務和客戶端應用程序運行相同的用戶帳戶? – Iridium
不,但不是用於啓用甚至通過不同機器加密/解密xml文件的非對稱加密?這是我的祕密(該文件可以通過不同的機器進行加密/解密) – SidAhmed
是的,但是您正在創建一個新的密鑰,並將其存儲在用戶的密鑰存儲區中。因此,其他用戶無法訪問該密鑰來執行解密。 – Iridium