2013-07-04 9 views
6

मैं स्ट्रीमरिएडर को उप-वर्गीकृत करके एक डिक्रिप्टेड फ़ाइल स्ट्रीम रीडर (डीएफएसआर) कक्षा बनाने की कोशिश कर रहा हूं, इसलिए मैं फ़ाइल नाम को अपने (डीएफएसआर) कन्स्ट्रक्टर में एन्क्रिप्टेड जानकारी के साथ पास कर सकता हूं और स्ट्रीमर के साथ वापस लौटा सकता हूं मैं StreamReader की रीडलाइन विधि पर कॉल कर सकता हूं।सबक्लास स्ट्रीमरडर एक डिक्रिप्ट बनाने के लिए फ़ाइल स्ट्रीम रीडर

मुझे पता है कि इसे नीचे कैसे करना है, लेकिन मुझे नहीं पता कि इसे क्लास क्लास के रूप में StreamReader के साथ कक्षा में कैसे अपवर्तित करना है।

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

इस वर्ग का उपयोग करने के लिए::

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

कि के दुरुपयोग होगा विरासत। आपको नियमित स्ट्रीमरडर का उपयोग करना चाहिए, लेकिन क्रिप्टोस्ट्रीम का उपयोग करने के लिए ठीक से प्रारंभ किया जाना चाहिए। असल में, जैसे आपका कोड अभी संरचित है। आप इसे सब एक सहायक विधि में डाल सकते हैं। विरासत यहां कोई मूल्य नहीं जोड़ता है। यदि आप किसी चीज़ से विरासत में जोर देते हैं, तो टेक्स्ट रीडर से प्राप्त करें और एक उचित प्रारंभिक StreamReader लपेटें। – usr

+0

@usr के साथ सहमत हैं कि आपको System.Security.Cryptography.CryptoStream का उपयोग करना चाहिए क्योंकि यह पहले से ही System.IO.Stream से विरासत में है। –

उत्तर

0

आप क्रिप्टो धारा निम्न के समान उत्पन्न करने के लिए निर्माता से एक स्थिर विधि का उपयोग कर सकते हैं

 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

'उपयोग' कथन फ़ाइल स्ट्रीम को बंद कर रहा है। इसे पाठक के जीवनकाल के लिए खुला रहने की जरूरत है। –

+0

'उपयोग' को हटाने के लिए यह समझ में आता है, क्या इसका मतलब है कि हमें 'rijAlg' और 'fs' statics घोषित करना होगा। यदि मैं 'एफएस' स्थिर बना देता हूं, तो इसका मतलब यह है कि इस वर्ग का सभी उदाहरण 'फ़ाइल नाम' नामक एक फ़ाइल तक सीमित है –

+0

@IreneLee: केवल एक चीज जिसे स्थिर होना आवश्यक है वह विधि ही है। विधि में पास किए गए किसी भी पैरामीटर उदाहरण, गैर स्थैतिक मान होंगे, ताकि आप इसे जो भी फ़ाइल नाम पसंद कर सकें, उसे कॉल कर सकें। –

संबंधित मुद्दे