// (c) 2006 Richard Grimes // www.grimes.demon.co.uk using System; using System.IO; using System.Xml; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.Security.Cryptography.X509Certificates; class App { // command line to encrypt: e infile outfile certfile // decrypt: d infile outfile static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: to encrypt: encrypt e infile outfile certfile"); Console.WriteLine(" to decrypt: encrypt d infile outfile"); return; } bool bEncrypt = (args[0][0] == 'e'); string inFile = args[1]; if (!File.Exists(inFile)) { Console.WriteLine("{0} does not exist", inFile); return; } string outFile = null; outFile = args[2]; if (File.Exists(outFile)) File.Delete(outFile); string certName = null; if (bEncrypt) { if (args.Length < 4) return; certName = args[3]; } if (bEncrypt) { EncryptDocument(inFile, outFile, certName); } else { DecryptDocument(inFile, outFile); } } static void EncryptDocument(string inFile, string outFile, string certName) { X509Certificate2 cert = GetCertificate(StoreName.AddressBook, certName); XmlDocument doc = new XmlDocument(); doc.Load(inFile); XmlElement elem = (XmlElement)doc.GetElementsByTagName("CreditCard")[0]; EncryptedXml encXml = new EncryptedXml(); EncryptedData enc = encXml.Encrypt(elem, cert); EncryptedXml.ReplaceElement(elem, enc, false); doc.Save(outFile); } static void DecryptDocument(string inFile, string outFile) { } static X509Certificate2 GetCertificate(StoreName storeName, string certname) { X509Store store = new X509Store(storeName, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, certname, false); store.Close(); if (certs.Count == 0) { return null; } return certs[0]; } }