Announcement

Collapse
No announcement yet.

string Array verschlüsselt speichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • string Array verschlüsselt speichern

    Hallo,

    ich möchte ein String Array mittels Rijndael verschlüsseln, auf der Platte speichern und dann natürlich wieder entschlüsseln und die entschlüsselten strings im String-Array speichern.

    Ich habe schon zig Codebeispiele durchgekaut, aber irgendwie wird immer nur ein Memorystream ver und entschlüsselt oder es wird nur ein einzelner String verschlüsselt, gespeichert, gelesen und wieder entschlüsselt. Ich möchte aber mehrere Strings in einer Datei speichern. Hier mal ein sehr vereinfachtes Beispiel, was ich meine:


    Code:
    namespace Test
    {
        public partial class Form1 : Form
        {
            private string[] strArr = new string[100];
            
            private byte[] TheKey = new byte[] { 0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76,
                                                0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76,
                                                0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76 };
            
            private byte[] TheIV = new byte[] { 0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76,
                                                0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76 };
    
            
            public Form1()
            {
                InitializeComponent();
                
                strArr[0] = "Text1";
                strArr[1] = "Ein sehr sehr langer Text könnte hier stehen";
                strArr[2] = "";
                strArr[3] = "A";
                // usw.
            }
    
            private void btn_Verschluesseln_Click(object sender, EventArgs e)
            {
                FileStream fs = null;
                CryptoStream cs = null;
                BinaryWriter bw = null;
    
                fs = File.Open("E:\\Temp\\Test.xxx", FileMode.Create);
                RijndaelManaged rij = new RijndaelManaged();
                rij.Key = TheKey;
                rij.IV = TheIV;
                ICryptoTransform encryptor = rij.CreateEncryptor(rij.Key, rij.IV);
                cs = new CryptoStream(fs, encryptor, CryptoStreamMode.Write);
                bw = new BinaryWriter(cs);
                
                for (int i = 0; i < 4; i++)
                {
                    bw.Write(strArr[i]);
                }
            }
    
            private void btn_Exit_Click(object sender, EventArgs e)
            {
                Application.Exit();  
            }
         
        }
    }
    Der Code funktioniert, aber ich weiss nicht wie ich die Datei entschlüsseln soll. Ich dachte mir das folgendermassen:

    Code:
    private void btn_Entschluesseln_Click(object sender, EventArgs e)
            {
                FileStream fs = null;
                CryptoStream cs = null;
                BinaryReader br = null;
    
                fs = File.Open("E:\\Temp\\Test.xxx", FileMode.Open, FileAccess.Read);
                RijndaelManaged rij = new RijndaelManaged();
                rij.Key = TheKey;
                rij.IV = TheIV;
                ICryptoTransform decryptor = rij.CreateDecryptor(rij.Key, rij.IV);
                cs = new CryptoStream(fs, decryptor, CryptoStreamMode.Read);
                br = new BinaryReader(cs);
    
                byte[] buffer = new byte[100];
     
                for (int i = 0; i < 4; i++)
                {
                    //Wie lese ich die Strings und schreibe sie ins Array???
                }
            }
    Hat jemand einen Ansatz für mich? Ich erwarte keine fertige Lösung, nur ein paar Tips. Vielleicht kann man es ja auch ganz anders machen ?

    Danke schon mal.

  • #2
    Der Code funktioniert, aber ich weiss nicht wie ich die Datei entschlüsseln soll.
    Woher weißt du das wenn du die Datei nicht entschlüsseln kannst


    Da du die strings einzeln verschlüsselst und dann einfach aneinander in ein File streamst hast du keine Info wie lang die einzelnen Teilstreams sind um sie entsprechend zu entschlüsseln. Die verschlüsselten Teilstrings deshalb durch ein Trennzeichen zu trennen um an die Teilstrings zu kommen hört sich aber eher falsch an. Bin kein Kryptografie Experte würde das aber als einfachen Angriffspunkt für einen Hacker ansehen da er mehrere verschlüsselte Teilstrings bekommt die mit dem jeweils gleichen Schlüssel verschlüsselt sind. Da kann man den Schlüssel dann bestimmt rausrechnen. Ich würde vor dem verschlüsseln hingehen und das Array in einem string joinen, getrennt durch irgendein Trennzeichen oder Trennphrase, und diesen string dann erst verschlüsselt ablegen. Diesen string kann man dann einfach entschlüsseln und dann wieder in ein Array splitten.

    Comment


    • #3
      Hallo und danke für die Antwort. Ich habs jetzt hinbekommen. Anstatt BinaryReader/Writer hab ich einfach StreamWriter/Reader genommen. Hier der Code, falls es jemand interessiert:


      Code:
      public partial class Form1 : Form
          {
              private string[] strArr = new string[100];
              
              private byte[] TheKey = new byte[] { 0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76,
                                                  0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76,
                                                  0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76 };
              
              private byte[] TheIV = new byte[] { 0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76,
                                                  0x49, 0x76, 0x61, 0x20, 0x4d, 0x65, 100, 0x76 };
      
              
              public Form1()
              {
                  InitializeComponent();
                  
                  strArr[0] = "Text1";
                  strArr[1] = "Ein sehr sehr langer Text könnte hier stehen";
                  strArr[2] = "";
                  strArr[3] = "A";
                  // usw.
              }
      
              private void btn_Verschluesseln_Click(object sender, EventArgs e)
              {
                  FileStream fs = null;
                  CryptoStream cs = null;
                  StreamWriter sw = null;
                 
                  fs = File.Open("E:\\Temp\\Test.xxx", FileMode.Create);
                  RijndaelManaged rij = new RijndaelManaged();
                  rij.Key = TheKey;
                  rij.IV = TheIV;
                  //rij.Padding = PaddingMode.Zeros;
                  ICryptoTransform encryptor = rij.CreateEncryptor(rij.Key, rij.IV);
                  cs = new CryptoStream(fs, encryptor, CryptoStreamMode.Write);
                  sw = new StreamWriter(cs);
                  
                  for (int i = 0; i < 4; i++)
                  {
                      sw.WriteLine(strArr[i]);
                  }
      
                  sw.Close();
                  cs.Close();
                  fs.Close(); 
      
              }
      
              private void btn_Exit_Click(object sender, EventArgs e)
              {
                  Application.Exit();  
              }
      
              private void btn_Entschluesseln_Click(object sender, EventArgs e)
              {
                  FileStream fs = null;
                  CryptoStream cs = null;
                  StreamReader sr = null;
      
                  fs = File.Open("E:\\Temp\\Test.xxx", FileMode.Open, FileAccess.Read);
                  RijndaelManaged rij = new RijndaelManaged();
                  rij.Key = TheKey;
                  rij.IV = TheIV;
                  ICryptoTransform decryptor = rij.CreateDecryptor(rij.Key, rij.IV);
                  cs = new CryptoStream(fs, decryptor, CryptoStreamMode.Read);
                  sr = new  StreamReader(cs);
      
                  // Hier werden die gespeicherten Strings entschlüsselt und im Array gespeichert
                  // (ab Index 4)
                  for (int i = 0; i < 4; i++)
                  {
                      strArr[i + 4] = sr.ReadLine();
                  }
      
                  sr.Close();
                  cs.Close();
                  fs.Close(); 
              }
      
             
          }

      Comment

      Working...
      X