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.
Im .NET-Framework gibt es dazu die Klasse RSACryptoServiceProvider.
Als erstes brauchen wir ein Schlüsselpaar:
RSACryptoServiceProvider crypto = new RSACryptoServiceProvider(); Console.WriteLine("Public Key: " + crypto.ToXmlString(false)); Console.WriteLine("Private Key: " + crypto.ToXmlString(true));
Wichtig ist, dass der private Schlüssel auch nur denjenigen zugänglich ist, die die Eingabedateien Erstellen und Signieren dürfen.
Als zweiten Schritt müssen wir die Eingabedatei signieren. Am besten mit einem eigenen kleinen Programm:
string PrivateKeyXML = "<RSAKeyValue><Modulus>mTtHmCNztKb75sDhxWRG....."; RSACryptoServiceProvider crypto = new RSACryptoServiceProvider(); crypto.FromXmlString(PrivateKeyXML); File.Delete(strSignatureFile); using (FileStream fsSignature = new FileStream(strSignatureFile, FileMode.Create, FileAccess.Write)) { using (FileStream fsInput = new FileStream(strFilename, FileMode.Open, FileAccess.Read)) { byte[] signature = crypto.SignData(fsInput, typeof(SHA1CryptoServiceProvider)); fsInput.Close(); fsSignature.Write(signature, 0, signature.Length); } fsOutput.Close(); } crypto.Clear();
Vor der Verarbeitung müssen wir dann nur noch die Signatur zu überprüfen:
RSACryptoServiceProvider crypto = new RSACryptoServiceProvider(); string PublicKeyXML = "<RSAKeyValue><Modulus>mTtHmCNzt...."; crypto.FromXmlString(PublicKeyXML); using (FileStream fsSignature = new FileStream(strSignatureFile, FileMode.Open, FileAccess.Read)) { byte[] signature = new byte[fsSignature.Length]; fsSignature.Read(signature, 0, signature.Length); fsSignature.Close(); using (FileStream fsInput = new FileStream(strFilename, FileMode.Open, FileAccess.Read)) { byte[] data = new byte[fsInput.Length]; fsInput.Read(data, 0, data.Length); fsInput.Close(); bool isOK = crypto.VerifyData(data, typeof(SHA1CryptoServiceProvider), signature); Console.WriteLine("Signatur ist OK: " + isOK); } } crypto.Clear();