Entwickler-Ecke

IO, XML und Registry - Verschlüsselungsproblem


coolace - Do 18.09.08 19:20
Titel: Verschlüsselungsproblem
Hy,

folgendes Problem ich habe eine Binärdatei die Passwörter speichert, die will ich natürlich
verschlüsseln. Da ich mich nicht damit auskenne hab ich bissel gegoogelt und das Teil
gefunden http://www.codoject.com/KB/security/dotnetcryptog.aspx und mir die SourceFile
gedownloaded. Es steht ich soll dem einen Key und einen Vektor übergeben. Hab ich getan mit
"fsdalfsaljf" und "fsajlkfsajlö" aber woher weiß das ding wo meine zu verschlüsselnde Datei ist?

C#-Quelltext
1:
Cryptography.Cryption Cryption = new Cryptography.Cryption("Your key","Your vector");                    



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:
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace Cryptography
{
  /// <summary>
  /// Summary description for Cryption.
  /// </summary>
  public sealed class Cryption
  {
    private RijndaelManaged Algorithm;
    private MemoryStream memStream;
    private ICryptoTransform EncryptorDecryptor;
    private CryptoStream crStream;
    private StreamWriter strWriter;
    private StreamReader strReader;

    private string m_key;
    private string m_iv;

    private byte[] key;
    private byte[] iv;

    private string pwd_str;
    private byte[] pwd_byte;

    public Cryption(string key_val, string iv_val)
    {
      key = new byte[32];
      iv = new byte[32];

      int i;
      m_key = key_val;
      m_iv = iv_val;

      for(i=0;i<m_key.Length;i++)
      {
        key[i] = Convert.ToByte(m_key[i]);
      }
      for(i=0;i<m_iv.Length;i++)
      {
        iv[i] = Convert.ToByte(m_iv[i]);
      }

    }

    public string Encrypt(string s)
    {
      Algorithm = new RijndaelManaged();

      Algorithm.BlockSize = 256;
      Algorithm.KeySize = 256;

      memStream = new MemoryStream();

      EncryptorDecryptor = Algorithm.CreateEncryptor(key,iv);

      crStream = new CryptoStream(memStream, EncryptorDecryptor, CryptoStreamMode.Write);

      strWriter = new StreamWriter(crStream);

      strWriter.Write(s);

      strWriter.Flush();
      crStream.FlushFinalBlock();

      pwd_byte = new byte[memStream.Length];
      memStream.Position = 0;
      memStream.Read(pwd_byte,0,(int)pwd_byte.Length);

      pwd_str = new UnicodeEncoding().GetString(pwd_byte);

      return pwd_str;
    }

    public string Decrypt(string s)
    {
      Algorithm = new RijndaelManaged();

      Algorithm.BlockSize = 256;
      Algorithm.KeySize = 256;

      MemoryStream memStream = new MemoryStream(new UnicodeEncoding().GetBytes(s));

      ICryptoTransform EncryptorDecryptor = Algorithm.CreateDecryptor(key,iv);
      memStream.Position = 0;
      CryptoStream crStream = new CryptoStream(memStream,EncryptorDecryptor,CryptoStreamMode.Read);
      strReader = new StreamReader(crStream);

      return strReader.ReadToEnd();
    }
    
  }
}


Gruß

Coolace


Flitzs - Do 18.09.08 21:08

Hey,

die Methoden der Klasse sind nur zum verschlüsseln / entschlüsseln eines String gedacht, d.h. den zu verschlüsselnden Text musst du der Methode Encrypt mitgeben welche dir dann den verschlüsselten Text zurückgibt, das umgekehrte bei der Methode Decrypt.

Zum schreiben / laden einer Datei empfiehlt sich die Klasse System.IO.File

mfg Flitzs


coolace - Fr 19.09.08 13:03

Hy,

vielen Dank für deine Hilfe, hab versucht was daraus zu basteln aber versteh nicht was ich falsch mache,
beim Öffnen erzeuge ichh eine Paramterisierte List mit den Passwortinfos und das Objekt Crypton.

C#-Quelltext
1:
2:
  List<Pw> pwliste = new List<Pw>();
  Cryptography.Cryption Cryption = new Cryptography.Cryption("Crypto Key""Inicalization Vector");




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:
  FileStream fsp = new FileStream(@"E:\Webdatenbank\pw.dat",FileMode.Open);
                BinaryFormatter binFormatter = new BinaryFormatter();
                pwliste = (List<Pw>)binFormatter.Deserialize(fsp);
                fsp.Close();
                Entschlüsseln();
        
        
        public void Entschlüsseln()
        {
            foreach (Pw temppws in pwliste)
            {
                Cryption.Encrypt(temppws.Benutzername);
                Cryption.Encrypt(temppws.Erinnerungsfrage);
                Cryption.Encrypt(temppws.Masterpasswort);
                Cryption.Encrypt(temppws.Seitenpasswort);
                Cryption.Encrypt(temppws.Weburl);
            }
        }
    
    
    public void Verschlüsseln()
        {
            foreach (Pw temppwsv in pwliste)
            {
                Cryption.Encrypt(temppwsv.Benutzername);
                Cryption.Encrypt(temppwsv.Erinnerungsfrage);
                Cryption.Encrypt(temppwsv.Masterpasswort);
                Cryption.Encrypt(temppwsv.Seitenpasswort);
                Cryption.Encrypt(temppwsv.Weburl);
            }
        }
    
    
     //speichern der Passwörter
          Verschlüsseln();
          FileStream fss = new FileStream(@"E:\Webdatenbank\pw.dat",FileMode.Create);
          BinaryFormatter binFormatter = new BinaryFormatter();
          binFormatter.Serialize(fss, pwliste);
          fss.Close();


Es kommt keine Fehlermeldung aber wenn ich die Binärdatei öffne seh ich das Sie unverschlüsselt ist, was mache ich falsch?

Danke und Gruß

Coolace


Th69 - Fr 19.09.08 14:11

Die Methoden Encrpyt/Decrypt liefern die ver-/entschlüsselte Zeichenkette als Rückgabewert zurück (es wird nicht in-place modifiziert).

Wenn du aber den Text selber verändern willst, dann mußt du ihn selber wieder zurückschreiben:

C#-Quelltext
1:
temppws.Benutzername = Cryption.Encrypt(temppws.Benutzername);                    


coolace - Fr 19.09.08 15:39

Hy,

danke für deine Hilfe, das verschlüsseln klappt einwandfrei, aber das entschlüsseln funktioniert dafür
aber irgendwie weniger komm aber irgendwie nicht drauf woran das liegen kann.


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:
FileStream fsp = new FileStream(@"E:\Webdatenbank\pw.dat",FileMode.Open);
                BinaryFormatter binFormatter = new BinaryFormatter();
                pwliste = (List<Pw>)binFormatter.Deserialize(fsp);
                fsp.Close();
                Entschlüsseln(); 
        
       public void Verschlüsseln()
        {
            for (int i = 0; i < pwliste.Count; i++)
            {
                pwliste[i].Benutzername = Cryption.Encrypt(pwliste[i].Benutzername);
                pwliste[i].Erinnerungsfrage = Cryption.Encrypt(pwliste[i].Erinnerungsfrage);
                pwliste[i].Masterpasswort = Cryption.Encrypt(pwliste[i].Masterpasswort);
                pwliste[i].Seitenpasswort = Cryption.Encrypt(pwliste[i].Seitenpasswort);
                pwliste[i].Weburl = Cryption.Encrypt(pwliste[i].Weburl);
            }
        }

        public void Entschlüsseln()
        {
            for (int i = 0; i < pwliste.Count; i++)
            {
                pwliste[i].Benutzername = Cryption.Decrypt(pwliste[i].Benutzername);
                pwliste[i].Erinnerungsfrage = Cryption.Decrypt(pwliste[i].Erinnerungsfrage);
                pwliste[i].Masterpasswort = Cryption.Decrypt(pwliste[i].Masterpasswort);
                pwliste[i].Seitenpasswort = Cryption.Decrypt(pwliste[i].Seitenpasswort);
                pwliste[i].Weburl = Cryption.Decrypt(pwliste[i].Weburl);
            }
                
            
        }
    
    //speichern der Passwörter
          Verschlüsseln();
          FileStream fss = new FileStream(@"E:\Webdatenbank\pw.dat",FileMode.Create);
          BinaryFormatter binFormatter = new BinaryFormatter();
          binFormatter.Serialize(fss, pwliste);
          fss.Close();
          this.Close();


Gruß

Coolace


coolace - Sa 20.09.08 14:58

Hy,

vielen Dank für eure Hilfe, hab es mit der File.Encrypt gemacht. Das andere funktioniert nicht
so wie ich mir das vorstelle.

Gruß

Coolace


Timosch - Sa 20.09.08 15:07

user profile iconcoolace hat folgendes geschrieben:
Hy,

vielen Dank für eure Hilfe, hab es mit der File.Encrypt gemacht. Das andere funktioniert nicht
so wie ich mir das vorstelle.

Gruß

Coolace

Du weißt aber schon, dass File.Encrypt AFAIK EFS verwendet und daher für deine Zwecke völlig ungeeignet ist? Es verhindert bloß, dass jemand z.B. den PC mit einer Bootdisk startet und die Datei ausliest, aber ein Auslesen der Datei bei gestartetem Rechner und angemeldetem Benutzer verhindert es in keinster Weise.


coolace - Sa 20.09.08 19:42

Das schon, aber zumindest passiert auch nichts mit den Daten wenn sich ein anderer User anmeldet da
das EFS-Zertifikat ja Usergebunden ist und ich mich erst tiefer in diese Verschlüsselung einarbeiten
muss, das was ich gefunden hab funzt nicht.

Danke und Gruß

Coolace