Witam
Mam taki mały problem, wzorując się na szyfrowaniu plików na stronie Microsoftu nie zbyt działa mi poprawnie w aktualnej wersji ma problem przy deszyfracji z odczytem klucza a we wcześniejszej pliki z innej maszyny nie mogły być rozszyfrowane na moim komputrze czy innej maszynie. Nie zbyt wiem dlaczego nie może go znaleźć ponieważ klucz zaszywam w dokumencie xml.
Potrzebowałbym szybkiej pomocy w rozwiązaniu tego problemu z góry dziękuję
Tutaj troche mojego kodu
private static void EncryptXML(XmlDocument Xml, string EncryptElement, string KeyName)
{
if (Xml == null || EncryptElement == null)
throw new ArgumentNullException();
var cspParams = new CspParameters { KeyContainerName = "XML_RSA_FTP_KEY" };
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
var rsaAlg = new RSACryptoServiceProvider(cspParams);
XmlElement element = Xml.GetElementsByTagName(EncryptElement)[0] as XmlElement;
try
{
RijndaelManaged SKey = new RijndaelManaged();
SKey.KeySize = 256;
EncryptedXml encryptedXml = new EncryptedXml();
byte[] encryptedElement = encryptedXml.EncryptData(element, SKey, false);
EncryptedData ElementData = new EncryptedData();
ElementData.Type = EncryptedXml.XmlEncElementUrl;
ElementData.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url);
EncryptedKey ek = new EncryptedKey();
byte[] KeyToEncrypt = EncryptedXml.EncryptKey(SKey.Key, rsaAlg, false);
ek.CipherData = new CipherData(KeyToEncrypt);
ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
DataReference dRef = new DataReference();
dRef.Uri = "#" + 2;
ek.AddReference(dRef);
var property = new XmlDocument().CreateElement("EncryptionProperty", EncryptedXml.XmlEncNamespaceUrl);
var Salt = "32324552";
property.InnerText = RijndaelManagedEncryption.EncryptRijndael(Convert.ToBase64String(rsaAlg.ExportCspBlob(true)), Salt);
var encProperty = new EncryptionProperty(property);
ek.AddProperty(encProperty);
KeyInfoName kin = new KeyInfoName();
kin.LoadXml(property);
ek.KeyInfo.AddClause(kin);
ElementData.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
ElementData.CipherData.CipherValue = encryptedElement;
EncryptedXml.ReplaceElement(element, ElementData, false);
}
catch (Exception ex)
{
throw;
}
//ElementData.KeyInfo = new KeyInfo();
//KeyInfoName KeyInformation = new KeyInfoName();
//KeyInformation.Value = KeyName;
//ek.KeyInfo.AddClause(KeyInformation);
//ElementData.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
//ElementData.CipherData.CipherValue = encryptedElement;
//EncryptedXml.ReplaceElement(element, ElementData, false);
}
private static void DecryptXML(XmlDocument Xml, RSA key, string KeyName)
{
if (Xml == null || key == null || KeyName == null)
throw new ArgumentNullException();
XmlDocument xmlDoc = Xml;
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "XML_RSA_FTP_KEY";
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider ftpkey = new RSACryptoServiceProvider(cspParams);
var Salt = "32324552";
var KeyInfo = xmlDoc.GetElementsByTagName("EncryptionProperty")[0].InnerText;
ftpkey.ImportCspBlob(Convert.FromBase64String(RijndaelManagedEncryption.DecryptRijndael(KeyInfo,
Salt)));
EncryptedXml encryptedXml = new EncryptedXml(xmlDoc);
encryptedXml.AddKeyNameMapping("ftpkey", ftpkey);
encryptedXml.DecryptDocument();
}
#endregion
}```
```c#
public class RijndaelManagedEncryption
{
#region Consts
/// <summary>
/// Change the Inputkey GUID when you use this code in your own program.
/// Keep this inputkey very safe and prevent someone from decoding it some way!!
/// </summary>
internal const string Inputkey = "560A18CD-6346-4CF0-A2E8-671F9B6B9EA9";
#endregion
#region Rijndael Encryption
/// <summary>
/// Encrypt the given text and give the byte array back as a BASE64 string
/// </summary>
/// <param name="text" />The text to encrypt
/// <param name="salt" />The pasword salt
/// <returns>The encrypted text</returns>
public static string EncryptRijndael(string text, string salt)
{
if (string.IsNullOrEmpty(text))
throw new ArgumentNullException("text");
var aesAlg = NewRijndaelManaged(salt);
var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
var msEncrypt = new MemoryStream();
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(text);
}
return Convert.ToBase64String(msEncrypt.ToArray());
}
#endregion
/// <summary>
/// Checks if a string is base64 encoded
/// </summary>
/// <param name="base64String" />The base64 encoded string
/// <returns>Base64 encoded stringt</returns>
public static bool IsBase64String(string base64String)
{
base64String = base64String.Trim();
return (base64String.Length % 4 == 0) &&
Regex.IsMatch(base64String, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
}
/// <summary>
/// Decrypts the given text
/// </summary>
/// <param name="cipherText" />The encrypted BASE64 text
/// <param name="salt" />The pasword salt
/// <returns>The decrypted text</returns>
public static string DecryptRijndael(string cipherText, string salt)
{
if (string.IsNullOrEmpty(cipherText))
throw new ArgumentNullException("cipherText");
if (!IsBase64String(cipherText))
throw new Exception("The cipherText input parameter is not base64 encoded");
string text;
var aesAlg = NewRijndaelManaged(salt);
var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
var cipher = Convert.FromBase64String(cipherText);
using (var msDecrypt = new MemoryStream(cipher))
{
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
text = srDecrypt.ReadToEnd();
}
}
}
return text;
}
#endregion
#region NewRijndaelManaged
/// <summary>
/// Create a new RijndaelManaged class and initialize it
/// </summary>
/// <param name="salt" />The pasword salt
/// <returns></returns>
private static RijndaelManaged NewRijndaelManaged(string salt)
{
if (salt == null) throw new ArgumentNullException("salt");
var saltBytes = Encoding.ASCII.GetBytes(salt);
var key = new Rfc2898DeriveBytes(Inputkey, saltBytes);
var aesAlg = new RijndaelManaged();
aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);
aesAlg.IV = key.GetBytes(aesAlg.BlockSize / 8);
return aesAlg;
}
#endregion
}