Archiv der Kategorie: c#

Signieren von Dateien

Wenn man sicherstellen will, dass eine Inputdatei nicht manipuliert werden kann, es aber nicht erforderlich ist diese zu verschlüsseln, ist das Signieren möglicherweise das Mittel der Wahl.

Hierbei wird die Datei mit dem Privatekey signiert und die Signatur in einer zusätzlichen Datei gespeichert. Bei der Programmausführung wird die Signatur mit dem öffentlichlichen Schlüssel überprüft, bevor der Inhalt verarbeitet wird. Signieren von Dateien weiterlesen

Verschlüsselung von Strings

nachdem ich es doch immer wieder brauche:

Verschlüsseln:

ByteConverter = new UnicodeEncoding();

RSACryptoServiceProvider crypto = new RSACryptoServiceProvider();

byte[] decryptedData = ByteConverter.GetBytes(Data);

byte[] encryptedData;
crypto.FromXmlString(KeyXML);
encryptedData = crypto.Encrypt(decryptedData, 
false);

string encData = Convert.ToBase64String(encryptedData);
crypto.Clear();

Console.WriteLine(„encrypted: „ + encData);

Entschlüsseln:

ByteConverter = new UnicodeEncoding();

RSACryptoServiceProvider crypto = new RSACryptoServiceProvider();

byte[] encryptedData = Convert.FromBase64String(encString);

byte[] decryptedData;
crypto.FromXmlString(KeyXML);
decryptedData = crypto.Decrypt(encryptedData,
false);

string decString = ByteConverter.GetString(decryptedData);
crypto.Clear();

Console.WriteLine(„decrypted: „ + decString);

In der offiziellen Onlinehilfe wird nicht über den Base64String gegangen, aber das führte bei mir immer zu nicht lesbaren Zeichen und damit „kaputten“ Strings.

Ein Beispiel für die Verschlüsselung von Dateien ist hier

Verwenden des Taskschedulers zum Starten mit anderen Credentials

Unter bestimmten Umständen kann es nötig sein einen Task für einen bestimmten Userkontext einzurichten und auch gleich auszuführen.

Ab Windows 6 (Vista und Windows Server 2008) gibt es für den Scheduler eine schöne API (Task Scheduler Referenz in der msdn), die unter C# als Verweis auf das Com-Objekt hinzugefügt werden kann.

Hier mal ein kleines Beispiel, wie der Task erstellt wird, mit ACLs versehen, gestartet und auf das Ergebnis gewartet wird und anschliessend wieder gelöscht wird: Verwenden des Taskschedulers zum Starten mit anderen Credentials weiterlesen

Verschlüsselung von Dateien

Nachdem die in diesem KB-Artikel beschriebene Methode beim Entschlüsseln nicht so hundertprozentig wieder den Originalzustand einer Datei erzeugt. (Umlaute und Sonderzeichen wurden hier einfach etwas wildes, nicht darstellbares). Habe ich hier die Variante, die den Originalinhalt wieder erzeugt. (Key und Initialisierungsvektor sollten natürlich auf sinnvolle Werte gesetzt werden 😉 ):

Verschlüsseln:

static void EncodeFile(string strFilename, string strNewFilename)
{
try
{
DESCryptoServiceProvider crypto = new DESCryptoServiceProvider();

crypto.IV = ASCIIEncoding.ASCII.GetBytes(„123454678“);
crypto.Key = ASCIIEncoding.ASCII.GetBytes(„12345678“);
crypto.Padding = PaddingMode.PKCS7;
crypto.Mode = CipherMode.ECB;

File.Delete(strNewFilename);
FileStream fsOutput = new FileStream(strNewFilename, FileMode.OpenOrCreate, FileAccess.Write);
CryptoStream cs = new CryptoStream(fsOutput, crypto.CreateEncryptor(), CryptoStreamMode.Write);

FileStream fsInput = new FileStream(strFilename, FileMode.Open, FileAccess.Read);
byte[] data = new byte[fsInput.Length];
fsInput.Read(data, 0, data.Length);

cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
cs.Close();

fsInput.Close();
fsOutput.Close();
crypto.Clear();
}
catch (FileNotFoundException e)
{
Console.WriteLine(„FEHLER – Datei “ + e.FileName + “ nicht gefunden“);
}
catch (Exception e)
{
Console.WriteLine(„FEHLER – “ + e.Message);
Console.WriteLine(„INFO – Targetsite: “ + e.TargetSite.Name);
Console.WriteLine(„INFO – Source: “ + e.Source);
}
}

Entschlüsseln:

static void DecodeFile(string strFilename, string strNewFilename)
{
try
{
DESCryptoServiceProvider crypto = new DESCryptoServiceProvider();

crypto.IV = ASCIIEncoding.ASCII.GetBytes(„12345678“);
crypto.Key = ASCIIEncoding.ASCII.GetBytes(„12345678“);
crypto.Padding = PaddingMode.PKCS7;
crypto.Mode = CipherMode.ECB;

File.Delete(strNewFilename);
FileStream fsInput = new FileStream(strFilename, FileMode.Open, FileAccess.Read);
FileStream fsOutput = new FileStream(strNewFilename, FileMode.OpenOrCreate, FileAccess.Write);

// Hier kommt jetzt der Teil, der sich unterscheidet
CryptoStream cs = new CryptoStream(fsOutput, crypto.CreateDecryptor(), CryptoStreamMode.Write);
byte[] data = new byte[fsInput.Length];
fsInput.Read(data, 0, data.Length);
cs.Write(data, 0, data.Length);

fsInput.Close();
cs.Close();
fsOutput.Close();
crypto.Clear();
}
catch (FileNotFoundException e)
{
Console.WriteLine(„FEHLER – Datei “ + e.FileName + “ nicht gefunden“);
}
catch (NullReferenceException e)
{
Console.WriteLine(„FEHLER – NullReference: “ + e.Message);
}
catch (Exception e)
{
Console.WriteLine(„FEHLER – “ + e.Message);
Console.WriteLine(„INFO – Targetsite: “ + e.TargetSite.Name);
Console.WriteLine(„INFO – Source: “ + e.Source);
Console.WriteLine(„INFO – : “ + e.HelpLink);
}
}

Verwenden des Outputs von Konsolprogrammen

Muss der Output von Konsolanwendungen direkt geparsed werden, kann das via Streamreader und der Standardoutput-Eigenschaft von System.Diagnostics.Process auf direktem Wege getan werden.

System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
try
{

 String aufruf, parameter;

 aufruf = „c:\\windows\\system32\\netstat.EXE“;
 parameter = „-na“;
 Console.WriteLine(aufruf + “ “ + parameter);
 myProcess.StartInfo.Arguments = parameter;
 myProcess.StartInfo.FileName = aufruf;
 myProcess.StartInfo.UseShellExecute = false;
 myProcess.StartInfo.RedirectStandardOutput = true; //<– Das hier sorgt dafuer, das stdout direkt zugreifbar wird
 myProcess.Start();
 myProcess.WaitForExit();
 Console.WriteLine(„Ergebnis des netstats: {0}“, myProcess.ExitCode);

}
catch (Exception e)
{
 Console.WriteLine(„Fehler beim NETSTAT“);
 Console.WriteLine(e.Message);
}

try
{
 using (StreamReader sr = myProcess.StandardOutput)
 {
  String line;
  while ((line = sr.ReadLine()) != null)
  {
   Console.WriteLine(line);
  }
 }
}
catch (Exception e)
{
 Console.WriteLine(„Fehler beim Auslesen des Outputs“);
 Console.WriteLine(e.Message);

Für Standarderror und Standardinput funktioniert das natürlich auch