Autor |
Beitrag |
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 08.01.17 22:17
Jein. Beim signieren kommt eine Signatur heraus. Bei den Beispiel von jfheins wo er RSA verwendet ist das so das von dem Datenstrom ein Hash berechnet wird und dieser dann per RSA verschlüsselt wird. Diese Kombination ist dann die Signatur. Und diese Signatur kann nur mit dem privaten Schlüssel erstellen und nur mit dem öffentlichen Schlüssel prüfen. Der Hash ist nur mittel zum Zweck und hilft allein nicht.
Du möchtest ja, wie du gesagt hast, verstehen wie dein Code funktioniert. Die verstärkte Version davon ist natürlich die logische Grundlage zu verstehen warum man das so kodiert. Hier jetzt RSA zu erklären und warum man nicht einfach per RSA die Nachricht verschlüsselt/signiert (was denkbar wäre) sondern noch ein Hash dazwischen geschaltet wird liegt im prinzipiellen Aufbau von RSA begründet und führt hier zuweit. Für andere asymmetrische Verschlüsselungen wäre das möglicherweise unnötig. Da kenne ich mich jetzt aber zu wenig aus um Namedropping zu betreiben oder es ist doch ein prinzipielles Problem asymmetrischer Verschlüsselungen die sich mir so nicht erschließt. Letztlich wenn dich die Details interessieren sollte du das einfach an geeigneter Stelle nachlesen wie genau RSA funktioniert und warum man wie damit signiert.
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mo 09.01.17 01:21
Also sagen wir mal, der Hashwert ist XYZ.
Mit deinem Privaten Schlüssel ("abcedefgh") verschlüsselst du diesen jetzt, Ergebnis ist "ÜKOOP".
Der öffentliche Schlüssel, der herausgegeben wird, ist aber nur ein Teil von dem privaten Schlüssel, sagen wir "defgh". Dieser Teil genügt, um den Hash zu entschlüsseln und aus "ÜKOOP" wieder XYZ zu machen.
Es ist aber nicht möglich, mit diesem öffentlichen Schlüssel einen anderen Hash zu verschlüsseln.
Genauer gesagt kannst du aus dem privaten Schlüssel immer den öffentlichen Schlüssel (leicht) errechnen, und Botschaften die mit dem einen verschlüsselt wurden mit dem anderen entschlüsseln. Deshalb heißt das auch asymmetrische Verschlüsselung. Wenn du Sachen mit dem privaten Schlüssel verschlüsselst, nennt man das Signatur. Nur du kannst Sachen signieren, aber jeder kann die Signatur prüfen (also, dass du es gewesen sein musst, der das verschlüsselt hat). Andersherum kann jeder mit dem öffentlichen Schlüssel Sachen verschlüsseln, die dann nur du lesen kannst.
Bei einer symmetrischen Verschlüsselung brauchst du zu ver- und entschlüsseln immer den gleichen Schlüssel. (Es gibt nur einen)
Vielleicht noch ein Wikipedia-Link: de.wikipedia.org/wik...risches_Kryptosystem
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Mo 09.01.17 17:23
Ah okay.
Also wird dann jetzt der ZIP an sich signiert, ja? Und wenn das Programm die neuste Programmversion vom Server herunterlädt, muss man in dem Moment noch nichts signieren, oder?
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Do 12.01.17 17:18
So, jetzt bin ich gerade dabei, den Updater zu programmieren, aber anscheinend gibt es einen Codeabschnitt, der nicht ausgeführt wird:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110:
| public void InstallNewUpdate() { try { WebClient client = new WebClient(); Uri URL = new Uri(@"http://meineURL.com/meineDatei.zip"); string LocalPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NewUpdate.zip");
client.DownloadFile(URL, LocalPath); MessageBox.Show("g"); client.DownloadFileCompleted += DownloadCompleted; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e) { try { string LocalPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NewUpdate.zip"); MessageBox.Show("hier 4"); var filename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NewUpdate.zip"); var fileContent = File.ReadAllBytes(filename);
if (fileContent.Length < 260) { MessageBox.Show("Fehlende Signatur oder unbekannter Algorithmus!", "Signaturprüfung"); } else { MessageBox.Show("Hier 1"); }
var rsaKey = File.ReadAllText(@"./public.xml"); byte[] signature = null; int signatureLength = 0;
using (var stream = new MemoryStream(fileContent)) { using (var reader = new BinaryReader(stream)) { stream.Seek(-4, SeekOrigin.End); signatureLength = reader.ReadInt32(); if (signatureLength != 256) { MessageBox.Show("Fehlende Signatur oder unbekannter Algorithmus!", "Signaturprüfung"); return; } else { stream.Seek(-4 - signatureLength, SeekOrigin.End); signature = reader.ReadBytes(signatureLength); MessageBox.Show("Hier 2"); } } } var contentLength = fileContent.Length - signatureLength - 4;
using (var rsa = new RSACryptoServiceProvider(2048)) { rsa.FromXmlString(rsaKey); var result = rsa.VerifyData(fileContent, 0, contentLength, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); if (result) { using (StreamReader reader = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mainlysoft", "mainlysoft_devassist"))) { string InstallationsPfad = reader.ReadLine(); if (InstallationsPfad != "") { string[] files = Directory.GetFiles(InstallationsPfad); foreach (var file in files) File.Delete(file);
MessageBox.Show("Hier"); ZipFile.ExtractToDirectory(LocalPath, InstallationsPfad); File.Delete(LocalPath); System.Diagnostics.Process.Start(Path.Combine(InstallationsPfad, "Entwicklungstool.exe")); Application.Exit(); } else { MessageBox.Show("Hier 3");
} } } else { MessageBox.Show("Beschädigte oder fehlerhafte Signatur!\rDieser Ordner wurde nicht von dem Mainlysoft Team freigegeben. Es kann sich um Schadsoftware handeln.\rBitte löschen Sie diesen Ordner, oder wenden Sie sich an den Mainlysoft Support.", "Signaturprüfung");
} } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private void button1_Click(object sender, EventArgs e) { InstallNewUpdate(); } |
Wenn ich das so jetzt ausführe, bekomme ich nur die Meldung "g", also gibt es irgendein Problem bei dem Download, oder?
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.01.17 17:30
Nein? Du hast den entsprechenenden MessageBox.Show() in einem ganz normalen Codepfad.
DownloadFile ist blockierend. Heißt die Methode kommt erst zurück wenn das File runtergeladen ist. Danach bekommst du dann dein "g". Completed wird nie aufgerufen weil da du ja nicht asynchron runterlädst (das wäre DownloadFileAsync). Ich sehe hier aber keine Notwendigkeit für Asynchronität. Macht es Sinn das Programm weiter benutzen zu können während dein Update runtergeladen wird?
Übrigens selbst wenn das asynchron wäre und Completed aufgerufen wird wäre deine Reihenfolge trotzdem falsch. Den Completed Event solltem man immer vor der eigentlichen Aktion verdrahten danach besteht immer die Möglichkeit das es zu spät ist. Aka der asynchrone Vorgang ist fertig bevor man den Event verdrahted hat und wurde bereits geworfen.
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Do 12.01.17 19:50
Vielen Dank, jetzt wird der Code ausgeführt.
Aber in dem selben Code, wie gepostet, kommt die Fehlermeldung: Der Prozess kann nicht auf die Datei NewUpdate zugreifen, da sie von einem anderen Prozess verwendet wird. Woran kann das jetzt liegen?
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.01.17 20:12
Zitat: | Vielen Dank, jetzt wird der Code ausgeführt.
Aber in dem selben Code, wie gepostet, kommt die Fehlermeldung |
Äh. Du hast nichts geändert aber jetzt gehts. Genau. Ich kann Code reparieren allein durch Fernkritik (bzw. anders kaputt machen). Bettet mich an
Ich vermute mal du hast DownloadFile in DownloadFileAsync geändert. Das ist dann ein Problem mit der Implementierung im WebClient (um nicht zu sagen Bug).
Der Webclient hat weiterhin ein Handle auf das File offen. DownloadFileAsync schließt leider den FileStream nicht bevor er DownloadFileCompleted feuert.
Du solltest besser DownloadFile verwenden wenn du das File sofort im Anschluss nach dem Download öffnen willst. Wenn du es unbedingt asynchron brauchst musst du leider das asynchrone um Downloadfile selber kodieren.
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 12.01.17 20:17
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.01.17 20:22
Äh .... da hat die Rechtschreibprüfung versagt. Wen man sich mal auf die verlässt. Mann, Mann, Mann
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Do 12.01.17 20:37
Ich habe den Code mal etwas angepasst:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105:
| public void LoadAndInstallNewUpdate() { try { WebClient client = new WebClient(); Uri URL = new Uri(@"http://meineURL.com/meineDatei.zip"); string LocalPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NewUpdate.zip");
client.DownloadFile(URL, LocalPath); MessageBox.Show("g"); if (HasValidSignature(LocalPath)) { InstallUpdate(LocalPath); } else { MessageBox.Show("Beschädigte oder fehlerhafte Signatur!\rDieser Ordner wurde nicht von dem Mainlysoft Team freigegeben. Es kann sich um Schadsoftware handeln.\rBitte löschen Sie diesen Ordner, oder wenden Sie sich an den Mainlysoft Support.", "Signaturprüfung"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private bool HasValidSignature(string filename) { var fileContent = File.ReadAllBytes(filename);
if (fileContent.Length < 260) { MessageBox.Show("Fehlende Signatur oder unbekannter Algorithmus!", "Signaturprüfung"); return false; } MessageBox.Show("Hier 1");
byte[] signature = null; int signatureLength = 0;
using (var stream = new MemoryStream(fileContent)) { using (var reader = new BinaryReader(stream)) { stream.Seek(-4, SeekOrigin.End); signatureLength = reader.ReadInt32(); if (signatureLength != 256) { MessageBox.Show("Fehlende Signatur oder unbekannter Algorithmus!", "Signaturprüfung"); return false; } else { stream.Seek(-4 - signatureLength, SeekOrigin.End); signature = reader.ReadBytes(signatureLength); MessageBox.Show("Hier 2"); } } } var contentLength = fileContent.Length - signatureLength - 4; var rsaKey = File.ReadAllText(@"./public.xml"); using (var rsa = new RSACryptoServiceProvider(2048)) { rsa.FromXmlString(rsaKey); return rsa.VerifyData(fileContent, 0, contentLength, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); } }
private void InstallUpdate(string filename) { using (StreamReader reader = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mainlysoft", "mainlysoft_devassist"))) { string InstallationsPfad = reader.ReadLine(); if (InstallationsPfad != "") { string[] files = Directory.GetFiles(InstallationsPfad); foreach (var file in files) File.Delete(file);
MessageBox.Show("Hier"); ZipFile.ExtractToDirectory(filename, InstallationsPfad); File.Delete(filename); System.Diagnostics.Process.Start(Path.Combine(InstallationsPfad, "Entwicklungstool.exe")); Application.Exit(); } else { MessageBox.Show("Hier 3"); } } }
private void button1_Click(object sender, EventArgs e) { LoadAndInstallNewUpdate(); } |
Arbeitspakete am besten schön in Funktionen einpacken, damit bleibt es übersichtlicher und die vermeidest die Situation, dass du den Dateipfad x-Mal bestimmst. (Ich habe das jetzt in Naotepad angepasst, es könnte sein, dass ich noch eine Kleinigkeit vergessen hab...)
Und eben nach dem Downloadvorgang die selbst die Funktionen aufrufen.
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Sa 14.01.17 10:29
So guten Morgen erstmal.
Soweit funktioniert erstmal alles, der ZIP wird heruntergeladen, die Signierung überprüft (wenn Falsch, wird gleich Alarm geschlagen), der ZIP wird extrahiert. Soweit so gut, aber wenn ich diesen Code ausführe, bekomme ich diese Fehlermeldungen nacheinander:
1. Das System kann die angegebene Datei nicht finden
2. Die Datei .../prog_version.txt ist bereits vorhanden
3: Die Datei .../prog_version.txt ist bereits vorhanden
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121:
| public void LoadAndInstallNewUpdate() { try { WebClient client = new WebClient(); Uri URL = new Uri(@"http://meineDaten.zip"); string LocalPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NewUpdate.zip");
client.DownloadFile(URL, LocalPath);
if (HasValidSignature(LocalPath) == 1) { InstallUpdate(LocalPath); } if (HasValidSignature(LocalPath) == 0) { Form2 f = new Form2(); f.ShowDialog();
if (f.Action == 1) { File.Delete(LocalPath); Application.Exit(); } } if (HasValidSignature(LocalPath) == 2) { MessageBox.Show("Bei der Prüfung der Signatur ist ein unbekannter Fehler aufgetreten.\rBitte versuchen Sie es erneut.", "unbekannter Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); } } catch(Exception ex) { MessageBox.Show(ex.Message); } } private int HasValidSignature(string filename) { try { var fileContent = File.ReadAllBytes(filename);
if (fileContent.Length < 260) { return 0; }
byte[] signature = null; int signatureLength = 0;
using (var stream = new MemoryStream(fileContent)) { using (var reader = new BinaryReader(stream)) { stream.Seek(-4, SeekOrigin.End); signatureLength = reader.ReadInt32(); if (signatureLength != 256) { return 0; } else { stream.Seek(-4 - signatureLength, SeekOrigin.End); signature = reader.ReadBytes(signatureLength); } } }
var updatePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Update"); ZipFile.ExtractToDirectory(filename, updatePath);
var contentLength = fileContent.Length - signatureLength - 4; var rsaKey = File.ReadAllText(Path.Combine(updatePath, "public.xml"));
using (var rsa = new RSACryptoServiceProvider(2048)) { rsa.FromXmlString(rsaKey); if (rsa.VerifyData(fileContent, 0, contentLength, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)) return 1; else return 0; } } catch(Exception ex) { MessageBox.Show(ex.Message); return 2; } } private void InstallUpdate(string filename) { try { using (StreamReader reader = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mainlysoft", "mainlysoft_devassist.txt"))) { string InstallationsPfad = reader.ReadLine(); if (InstallationsPfad != "") { string[] files = Directory.GetFiles(InstallationsPfad); foreach (var file in files) { MessageBox.Show(file); }
MessageBox.Show(filename); System.Diagnostics.Process.Start(Path.Combine(InstallationsPfad, "Entwicklertool.exe")); Application.Exit(); } } } catch(Exception ex) { MessageBox.Show(ex.Message); } } private void button1_Click(object sender, EventArgs e) { LoadAndInstallNewUpdate(); } |
Soo, ich extrahiere den ZIP ja nur, weil die eine Methode die public.xml Dateo einlesen muss. Ich habe auch mal geguckt, die Ordner wurden alle korrekt erstellt und haben den erwünschten Inhalt. Aber irgenwie finde ich den Fehler einfach nicht
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Sa 14.01.17 13:58
Zum Febugging: Es wäre viel hilfreicher, wenn du dazu sagen könntest, wo genau die Fehler auftreten.
Du hattest irgendwie sowas wie Exception-Panik, weil du überall try-catch Blöcke hinschreibst und die Message anzeigst. Das führt aber dazu, dass du nicht mehr sagen kannst, wo genau der Fehler auftritt. Wenn du mit dem Debugger (Visual Studio oben das grüne Play Symbol) startest, sollte er eigentlich genau dort anhalten wo der Fehler auftritt.
Dann weiter:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private int HasValidSignature(string filename) { try { } catch(Exception ex) { MessageBox.Show(ex.Message); return 2; } } |
Das ist relativ sinnlos. Du ersetzt die informative Exception durch einen nichtssagen Fehlercode 2 und zeigst dem Benutzer eine Nachricht, mit der er vermutlich nichts anfangen kann. Aber das eigentlich sinnlose ist ja, dass um den Aufruf ebenfalls ein try-catch drum ist, was das gleiche macht! Also könnte man auch einfach die Exception hochlaufen lassen und nur in LoadAndInstallNewUpdate() behandeln.
Dann ganz wichtig:
C#-Quelltext 1: 2: 3: 4: 5:
| var updatePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Update"); ZipFile.ExtractToDirectory(filename, updatePath);
var contentLength = fileContent.Length - signatureLength - 4; var rsaKey = File.ReadAllText(Path.Combine(updatePath, "public.xml")); |
Ich hab dir schon geschrieben, dass der public Key NICHT aus dem Update kommen darf. Aber du entzippt hier das Update um den Key zu lesen. Dann kannst du dir das ganze auch sparen.
Zu deinen Fehlern: Bitte führe dein Programm mal im Debugger aus und gehe Schritt für Schritt vor (mit F10 und F11) und finde heraus, an welcher Stelle der erste Fehler auftritt.
Es gab hier irgendwo auch mal ein Debugger-Tutorial, ich suche das mal...
Hab auf die Schnelle nur MSDN gefunden: msdn.microsoft.com/d...ibrary/y740d9d3.aspx
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Di 24.01.17 20:17
Soo vielen Dank Leute, jetzt funktioniert fast alles.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123:
| public void LoadAndInstallNewUpdate() { using (StreamReader reader = new StreamReader(file)) { x1 = reader.ReadLine(); c2 = reader.ReadLine(); c3 = reader.ReadLine();
if (reader.ReadLine() == "update") { WebClient client = new WebClient(); Uri URL = new Uri(@".......zip"); string LocalPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NewUpdate.zip");
client.DownloadFile(URL, LocalPath); int HashValue = HasValidSignature(LocalPath); MessageBox.Show("Hier 100000");
if (HashValue == 1) { MessageBox.Show("Begin installation"); InstallUpdate(LocalPath); } if (HashValue == 0) { Form2 f = new Form2(); f.ShowDialog();
if (f.Action == 1) { File.Delete(LocalPath); Application.Exit(); } } if (HasValidSignature(LocalPath) == 2) { MessageBox.Show("Bei der Prüfung der Signatur ist ein unbekannter Fehler aufgetreten.\rBitte versuchen Sie es erneut.", "unbekannter Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); } } }
} private int HasValidSignature(string filename) {
var fileContent = File.ReadAllBytes(filename);
if (fileContent.Length < 260) { return 0; }
byte[] signature = null; int signatureLength = 0;
using (var stream = new MemoryStream(fileContent)) { using (var reader = new BinaryReader(stream)) { stream.Seek(-4, SeekOrigin.End); signatureLength = reader.ReadInt32(); if (signatureLength != 256) { return 0; } else { stream.Seek(-4 - signatureLength, SeekOrigin.End); signature = reader.ReadBytes(signatureLength); } } }
var contentLength = fileContent.Length - signatureLength - 4; var rsaKey = "...";
using (var rsa = new RSACryptoServiceProvider(2048)) { rsa.FromXmlString(rsaKey); if (rsa.VerifyData(fileContent, 0, contentLength, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)) return 1; else return 0; }
} private void InstallUpdate(string filename) { InstallationsPfad = "...."; if (InstallationsPfad != x1) { DeleteFiles(InstallationsPfad);
Directory.CreateDirectory(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MSUpd")); ZipFile.ExtractToDirectory(filename, Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MSUpd")); DirectoryCopy(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MSUpd"), InstallationsPfad, true);
if (File.Exists(filename)) { File.Delete(filename); MessageBox.Show("Hier 3"); }
MessageBox.Show("HIer 1234"); }
using (StreamWriter writer = new StreamWriter(file)) { writer.WriteLine(InstallationsPfad); writer.WriteLine(x1); writer.WriteLine(c2); writer.WriteLine("update installed"); writer.Close(); }
System.Diagnostics.Process.Start(...); Application.Exit(); |
An sich funktioniert alles, die Daten werden transferiert, die Text Datei wird umschrieben und das Hauptprogramm wird gestartet. Wenn das Hauptprogramm startet, stürzt es nach 1s wieder ab und bei dem Updater kommt ein Fehler, genau in dieser Zeile: var fileContent = File.ReadAllBytes(filename);
Das ist ja logisch, weil der ZIP ja gelöscht wurde, aber was ich jetzt nicht verstehe ist, warum er den Codeblock nochmal ausführt
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 25.01.17 00:27
In Zeile 35: if (HasValidSignature(LocalPath) == 2)
Zu der Frage, woher der Aufruf kommt, kannst du dir den Call Stack angucken: msdn.microsoft.com/e...ibrary/a3694ts5.aspx
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Mi 25.01.17 19:00
Vielen Dank, an sich funktioniert die Installation an sich jetzt problemfrei. Jetzt habe ich eine Datei (.txt) die alle wichtigen Daten beinhaltet. Wenn das Update installiert wurde, muss eine Zeile in der Datei geändert werden. Aber bis jetzt funktioniert es nicht. Erst werden die Daten gelesen, in den Zwischenspeicher geholt und dann muss der StreamReader diese Daten wieder in die Datei schreiben und die letzte Zeile ändern. Wenn ich das Programm so ausführe, dass werden die Werte einfach an die letzte Zeile dran gehängt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| string x1 = streamReader.ReadLine(); string x2 = streamReader.ReadLine();
streamWriter.Write(""); streamWriter.WriteLine(x1); streamWriter.WriteLine(x2); |
Also muss ich iwie die Datei leer bekommen, damit der StreamReader von vorne anfangen kann. Wie mache ich das?
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 25.01.17 19:23
Habe ich nicht ganz verstanden. Dem StreamWriter kannst du mitgeben ob er anhängen oder überschreiben soll.
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Mi 25.01.17 21:31
Ich lasse den StreamWriter über einen FileStrem laufen und deshalb akzeptiert er keinen Boolean
Gibt es noch eine Möglichkeit, dass der StreamWriter eine Datei überschreibt und trotzdem einen FileStream benutzt?
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 25.01.17 21:40
Du kannst den (zugrundeliegenden) FileStream wieder auf Anfang setzen: stream.Seek(0, SeekOrigin.Begin);
msdn.microsoft.com/d....seek(v=vs.110).aspx
|
|
Csharp-programmierer
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Do 26.01.17 22:01
Soo vielen Dank, jetzt funktioniert wirklich alles.
Auf meinem Entwicklungs PC funktioniert alles, aber wenn ich das Programm auf meinem Laptop ausführe, bekomme ich von dem Update diesen Fehler: Der Typ "System.Security.Ceyptography.HashAlgorithmName" In der Assembly "mscorlib...." konnte nicht gefunden werden. Wieso kommt jetzt dieser Fehler?
_________________ "Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 26.01.17 23:09
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
|