EduNetworkBuilder/EduNetworkBuilder/TrippleDESDocumentEncryption.cs

174 lines
5.4 KiB
C#
Raw Normal View History

2017-07-31 18:26:49 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Xml;
namespace EduNetworkBuilder
{
/// <summary>
/// Copied from https://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.encryptedxml(v=vs.110).aspx
/// </summary>
class TrippleDESDocumentEncryption
{
protected XmlDocument docValue;
protected TripleDES algValue;
2017-08-01 15:42:28 +02:00
/// <summary>
/// The characters we use for passwords and salts.
/// </summary>
protected const string PWChars = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ234567890_.!#$^*";
2017-08-01 15:42:28 +02:00
2017-07-31 18:26:49 +02:00
public TrippleDESDocumentEncryption(XmlDocument Doc, TripleDES Key)
{
if (Doc != null)
{
docValue = Doc;
}
else
{
throw new ArgumentNullException("Doc");
}
if (Key != null)
{
algValue = Key;
}
else
{
throw new ArgumentNullException("Key");
}
}
public XmlDocument Doc { set { docValue = value; } get { return docValue; } }
public TripleDES Alg { set { algValue = value; } get { return algValue; } }
public void Clear()
{
if (algValue != null)
{
algValue.Clear();
}
else
{
throw new Exception("No TripleDES key was found to clear.");
}
}
public void Encrypt(string Element)
{
// Find the element by name and create a new
// XmlElement object.
XmlElement inputElement = docValue.GetElementsByTagName(Element)[0] as XmlElement;
// If the element was not found, throw an exception.
if (inputElement == null)
{
throw new Exception("The element was not found.");
}
// Create a new EncryptedXml object.
EncryptedXml exml = new EncryptedXml(docValue);
// Encrypt the element using the symmetric key.
byte[] rgbOutput = exml.EncryptData(inputElement, algValue, false);
// Create an EncryptedData object and populate it.
EncryptedData ed = new EncryptedData();
// Specify the namespace URI for XML encryption elements.
ed.Type = EncryptedXml.XmlEncElementUrl;
// Specify the namespace URI for the TrippleDES algorithm.
ed.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncTripleDESUrl);
// Create a CipherData element.
ed.CipherData = new CipherData();
// Set the CipherData element to the value of the encrypted XML element.
ed.CipherData.CipherValue = rgbOutput;
// Replace the plaintext XML elemnt with an EncryptedData element.
EncryptedXml.ReplaceElement(inputElement, ed, false);
}
public void Decrypt()
{
// XmlElement object.
XmlElement encryptedElement = docValue.GetElementsByTagName("EncryptedData")[0] as XmlElement;
// If the EncryptedData element was not found, throw an exception.
if (encryptedElement == null)
{
throw new Exception("The EncryptedData element was not found.");
}
// Create an EncryptedData object and populate it.
EncryptedData ed = new EncryptedData();
ed.LoadXml(encryptedElement);
// Create a new EncryptedXml object.
EncryptedXml exml = new EncryptedXml();
// Decrypt the element using the symmetric key.
byte[] rgbOutput = exml.DecryptData(ed, algValue);
// Replace the encryptedData element with the plaintext XML elemnt.
exml.ReplaceData(encryptedElement, rgbOutput);
}
2017-08-01 15:42:28 +02:00
protected static string GenCharString(Random RanGen, int length)
{
int next;
string result = "";
for(int i=0; i< length; i++)
{
next = RanGen.Next(PWChars.Length);
result += PWChars[next];
}
return result;
}
public static string GenSalt(Random RanGen)
{
return GenSalt(RanGen, NB.DefaultSaltLen);
}
public static string GenSalt(Random RanGen, int length)
{
return GenCharString(RanGen, length);
2017-08-01 15:42:28 +02:00
}
public static string GenUserPW(Random RanGen)
{
return GenUserPW(RanGen, NB.DefaultPasswordLen);
}
public static string GenUserPW(Random RanGen, int length)
{
return GenCharString(RanGen, length);
2017-08-01 15:42:28 +02:00
}
2017-08-01 15:52:16 +02:00
public static TripleDES GenKey(string password, string salt)
{
TripleDESCryptoServiceProvider tDESkey = new TripleDESCryptoServiceProvider();
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
var p = new Rfc2898DeriveBytes(password, saltBytes);
tDESkey.IV = p.GetBytes(tDESkey.BlockSize / 8);
tDESkey.Key = p.GetBytes(tDESkey.KeySize / 8);
return tDESkey;
}
public void SetKey(string password, string salt)
{
algValue = GenKey(password, salt);
}
2017-07-31 18:26:49 +02:00
}
}