Autor Beitrag
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden volle Höhe C#-Quelltext
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");
                // Signatur prüfen
                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;

                // Signatur auslesen, sie hängt hinten an der Datei
                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;

                // Signatur gegen den vorhergehenden Teil (= das zip Archiv) prüfen
                using (var rsa = new RSACryptoServiceProvider(2048))
                {
                    rsa.FromXmlString(rsaKey);
                    var result = rsa.VerifyData(fileContent, 0, contentLength, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
                    if (result)
                    {
                        // Weitere Progeamminstallation
                        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 :flehan:

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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 12.01.17 20:17 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
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 :flehan:
An was sollen wir Dich betten? :gruebel: "Ralf Jansen an Champignonrahm"? :D

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 12.01.17 20:22 
Äh .... da hat die Rechtschreibprüfung versagt. Wen man sich mal auf die verlässt. Mann, Mann, Mann :oops:
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Do 12.01.17 20:37 
Ich habe den Code mal etwas angepasst:
ausblenden volle Höhe C#-Quelltext
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() // Besserer Name
    {
      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");
        // Nachfolgeoperationen einfach direkt aufrufen...
        // Alternativ korrekt asynchron und das Completed-Event möglichst früh zuweisen.
        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);
      }
    }
    
    // Signaturprüfung als eigene Aufgabe, die mit einem Parameter auskommt und einen einfachen Rückgabewert hat :-)
    private bool HasValidSignature(string filename)
    {
      var fileContent = File.ReadAllBytes(filename);

      if (fileContent.Length < 260)
      {
        MessageBox.Show("Fehlende Signatur oder unbekannter Algorithmus!""Signaturprüfung"); // Je nach Anwendungsfall vll. eine Exception
        return false;
      }
      
      MessageBox.Show("Hier 1");

      byte[] signature = null;
      int signatureLength = 0;

      // Signatur auslesen, sie hängt hinten an der Datei
      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"); // Je nach Anwendungsfall vll. eine Exception
            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");
      
      // Signatur gegen den vorhergehenden Teil der Datei (= das zip Archiv) prüfen
      using (var rsa = new RSACryptoServiceProvider(2048))
      {
        rsa.FromXmlString(rsaKey);
        return rsa.VerifyData(fileContent, 0, contentLength, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
      }
    }

    // Installationsvorgang trennen
    private void InstallUpdate(string filename)
    {
      // Weitere Programminstallation
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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

ausblenden volle Höhe C#-Quelltext
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;

                // Signatur auslesen, sie hängt hinten an der Datei
                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"));

                // Signatur gegen den vorhergehenden Teil der Datei (= das zip Archiv) prüfen
                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);
                        //File.Delete(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 :gruebel:

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        private int HasValidSignature(string filename)
        {
            try
            {
                // Sehr viel Code
            }
            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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Di 24.01.17 20:17 
Soo vielen Dank Leute, jetzt funktioniert fast alles.

ausblenden volle Höhe C#-Quelltext
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;

            // Signatur auslesen, sie hängt hinten an der Datei
            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 = "...";

            // Signatur gegen den vorhergehenden Teil der Datei (= das zip Archiv) prüfen
            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)
            {
                // Alte Programmdaten löschen
                // Installationspfad: Dokumente -> Mainlysoft Devassist -> Programm DLL's, .exe's ...
                DeleteFiles(InstallationsPfad);

                // Neue Programmdaten aufspielen
                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);

                // Installationsordner löschen
                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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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? :eyes:

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 26.01.17 23:09 
- Nachträglich durch die Entwickler-Ecke gelöscht -