2013-07-04 25 views
6

Próbuję utworzyć odszyfrowaną klasę odczytu strumienia plików (DFSR), dzieląc podklasy StreamReader, tak aby móc przekazać nazwę pliku z encrpytowanymi informacjami do jego konstruktora (DFSR) i powrócić za pomocą obiektu streamReader, który Mogę wywołać metodę ReadLine StreamReadera.Podklasa StreamReader do utworzenia odszyfrowania Czytnik strumienia plików

Wiem, jak to zrobić, jak poniżej, ale nie wiem, jak refractor go do klasy z StreamReader jako klasa nadrzędna.

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

To byłoby nadużycie dziedzictwo. Powinieneś tylko użyć zwykłego StreamReadera, ale poprawnie zainicjowanego, aby używać CryptoStream. Zasadniczo, tak jak twój kod jest teraz zbudowany. Możesz umieścić to wszystko w metodzie pomocnika. Dziedziczenie nie dodaje tutaj żadnej wartości. Jeśli nalegasz na dziedziczenie z czegoś, dziedzicz z TextReader i zawiń prawidłowo zainicjowany StreamReader. – usr

+0

Zgadzam się z @usr, że powinieneś używać System.Security.Cryptography.CryptoStream, ponieważ już dziedziczy z System.IO.Stream. –

Odpowiedz

0

Można użyć metody statycznej z konstruktora do generowania strumienia kryptograficznego podobny do następującego:

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); 
      } 
     } 
    } 
} 

Aby skorzystać z tej klasy:

 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

Instrukcja 'using' zamyka strumień plików. Musi pozostać otwarta przez całe życie czytelnika. –

+0

To ma sens, aby usunąć "używanie", Czy to oznacza, że ​​będziemy musieli zadeklarować statykę "rijAlg" i "fs". Jeśli zrobię statyczny "fs", oznacza to, że wszystkie wystąpienia tej klasy są ograniczone do pojedynczego pliku o nazwie "filename". –

+0

@IreneLee: jedyną rzeczą, która musi być statyczna, jest sama metoda. Wszelkie parametry przekazane do metody to wartości instancji, niestatyczne, dzięki czemu możesz wywoływać je dowolnymi nazwami plików. –