2013-07-04 5 views
6

Ich versuche eine entschlüsselte File stream reader (DFSR) -Klasse durch Unterklasse von StreamReader zu erstellen, damit ich den Dateinamen mit encrpyted info an seinen (DFSR) -Konstruktor übergeben und mit dem streamReader zurückgeben kann Ich kann die ReadLine-Methode von StreamReader aufrufen.Unterklasse StreamReader zum Entschlüsseln Dateistream Reader

Ich weiß, wie es geht, wie unten, aber ich weiß nicht, wie man es in eine Klasse mit StreamReader als Elternklasse refractor.

using (Rijndael rijAlg = Rijndael.Create()) 
{ 
    rijAlg.Key = DX_KEY_32; 
    rijAlg.IV = DX_IV_16; 

    // Create a decrytor to perform the stream transform. 
    using (FileStream fs = File.Open("test.crypt", FileMode.Open)) 
    { 
     using (CryptoStream cs = new CryptoStream(fs, rijAlg.CreateDecryptor(), CryptoStreamMode.Read)) 
     { 
      using (StreamReader sr = new StreamReader(cs)) 
      { 
       string line; 
       // Read and display lines from the file until the end of 
       // the file is reached. 
       while ((line = sr.ReadLine()) != null) 
       { 
        Console.WriteLine(line); 
       } 
      } 

     } 
    } 

} 
+1

Das ist ein Missbrauch wäre von Erbe. Was Sie tun sollten, ist, nur den regulären StreamReader zu verwenden, aber ordnungsgemäß initialisiert, um einen CryptoStream zu verwenden. Im Prinzip, genauso wie Ihr Code gerade strukturiert ist. Sie können all das in eine Hilfsmethode einfügen. Vererbung fügt hier keinen Wert hinzu. Wenn Sie darauf bestehen, von etwas zu erben, erben Sie von TextReader und verpacken Sie einen ordnungsgemäß initialisierten StreamReader. – usr

+0

Vereinbaren Sie mit @usr, dass Sie System.Security.Cryptography.CryptoStream verwenden sollten, da es bereits von System.IO.Stream erbt. –

Antwort

0

Sie können eine statische Methode aus dem Konstruktor verwenden, um den Verschlüsselungsstrom ähnlich den folgend zu erzeugen:

public class EncryptingFileStream : System.IO.StreamReader 
{ 

    public EncryptingFileStream(string fileName, byte[] key, byte[] IV) 
     : base(GenerateCryptoStream(fileName, key, IV)) 
    { 
    } 

    private static System.IO.Stream GenerateCryptoStream(string fileName, byte[] key, byte[] IV) 
    { 

     using (System.Security.Cryptography.Rijndael rijAlg = System.Security.Cryptography.Rijndael.Create()) 
     { 
      rijAlg.Key = key; 
      rijAlg.IV = IV; 

      // Create a decrytor to perform the stream transform. 
      using (System.IO.FileStream fs = System.IO.File.Open(fileName, System.IO.FileMode.Open)) 
      { 
       return new System.Security.Cryptography.CryptoStream(fs, rijAlg.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read); 
      } 
     } 
    } 
} 

diese Klasse zu verwenden:

 using (EncryptingFileStream fs = new EncryptingFileStream("test.crypt", DX_KEY_32, DX_IV_16)) 
     { 
      string line; 
      // Read and display lines from the file until the end of 
      // the file is reached. 
      while ((line = fs.ReadLine()) != null) 
      { 
       Console.WriteLine(line); 
      } 
     } 
+0

Die Anweisung 'using' schließt den Dateistream. Es muss für die Lebenszeit des Lesers offen bleiben. –

+0

Es ist sinnvoll, 'using' zu entfernen. Bedeutet das, dass wir 'rijAlg' und 'fs' Statik deklarieren müssen. Wenn ich 'fs' statisch mache, heißt das, dass alle Instanzen dieser Klasse auf eine einzige Datei namens 'Dateiname' beschränkt sind. –

+0

@IreneLee: Das einzige, was statisch sein muss, ist die Methode selbst. Alle Parameter, die an die Methode übergeben werden, sind Instanzen, nicht statische Werte, so dass Sie sie mit beliebigen Dateinamen aufrufen können. –