mit Rijndael und Cryptostream richtig entschlüsseln



  • if(schlDateiNeu == true)
    
    {
    
        generateAES(passwd);
    
        generateRSA();
    
        FileStream fsschl = new FileStream(schlDatei.FullName, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
    
        byte[] b = new byte[1];
    
        b[0] = Convert.ToByte(salt.Length);
    
        fsschl.Write(b, 0, b.Length);
    
        b = ASCIIEncoding.ASCII.GetBytes(salt);
    
        fsschl.Write(b, 0, b.Length);
    
        b = new byte[symCrypt.IV.Length];
    
        fsschl.Write(b,0,b.Length);
    
        ICryptoTransform transform = symCrypt.CreateEncryptor(); 
    
        CryptoStream cryptStream = new CryptoStream(fsschl, transform,CryptoStreamMode.Write);
    
        b = ASCIIEncoding.ASCII.GetBytes(asymCrypt.ToXmlString(true));
    
        cryptStream.Write(b,0,b.Length);
    
        cryptStream.FlushFinalBlock();
    
        fsschl.Close();
    
    }
    
    else
    
    {
    
        FileStream fsschl = new FileStream(schlDatei.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    
        symCrypt = new RijndaelManaged();
    
        byte[] b = new byte[1];
    
        fsschl.Read(b, 0, b.Length);
    
        b = new byte[Convert.ToInt32(b[0])];
    
        fsschl.Read(b,0,b.Length);
    
        salt = ASCIIEncoding.ASCII.GetString(b);
    
        b = new byte[16];
    
        fsschl.Read(b,0,b.Length);
    
        symCrypt.IV = b;
    
        String saltedPass = "";
    
        for(int i = 0, j = 0; i < passwd.Length || j < salt.Length; i++, j++)
    
        {
    
         if(i < passwd.Length)
    
         saltedPass = saltedPass + passwd.ToCharArray()[i];
    
         if(j < salt.Length)
    
         saltedPass = saltedPass + salt.ToCharArray()[j];
    
        }
    
        symCrypt.Key = ASCIIEncoding.ASCII.GetBytes(saltedPass);
    
        ICryptoTransform transform = symCrypt.CreateDecryptor();
    
        CryptoStream cryptStream = new CryptoStream(fsschl, transform, CryptoStreamMode.Read);
    
        String temp = "";
    
        b = new byte[schlDatei.Length - fsschl.Position];
    
        try
    
        {
    
         cryptStream.Read(b,0,b.Length);
    
         temp = ASCIIEncoding.ASCII.GetString(b, 0, b.Length);     
    
        }
    
        catch(Exception ex)
    
        {
    
         System.Console.Out.WriteLine(ex);
    
        }
    
        fsschl.Close();
    

    symCrypt ist eine Instanz von RijndaelManaged und asymCrypt von RSACryptoServiceProvider, dessen Daten ich verschlüsseln will. Die erste Hälfte der if-Schleife verschlüsselt die Daten, die 2. entschlüsselt sie.

    Das Passwort wird mit einem zufälligen Salt verschlüsselt. Das Abspeichern geht folgendermaßen vor sich: [Länge des Salt][Salt][Rijndael.IV][Daten]

    Es klappt auch (fast) alles und ich bekomme auch einen Großteil meiner verschlüsselten Daten wieder, allerdings ist der Anfang des entschlüsselten Textes immer nur Mist (10-15 Zeichen Buchstabensalat)

    Wenn irgendjemand eine Idee hat, wäre ich sehr froh (hänge da jetzt schon 6 Stunden dran).

    Azraelgod


Anmelden zum Antworten