Search code examples
c#windows-phone-7encryptionisolatedstorage

Windows Phone 7: Decrypting many files from isolated storage


I'm trying do to a program which stores many (5-15) .txt files in phone's isolated storage memory. I noticed how easy it is to read those files with programs like Windows Phone Power Tools so I decided to to encrypt them. I'm using this link as a tutorial:

http://msdn.microsoft.com/en-us/library/windows/apps/hh487164(v=vs.105).aspx

Encryption works fine, as I'm obviously saving one file at a time. However, I'm having problems while trying to decrypt them. How should i edit my code so I can decrypt many .txt files? Below are my codes that I'm using at the moment:

      private void IsoRead()
  {   
      System.IO.IsolatedStorage.IsolatedStorageFile local =
      System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication();

      string[] filenames = local.GetFileNames("./DataFolder/*.txt*");
      foreach (var fname in filenames)
      {
          //retrieve byte
              byte[] ProtectedByte = this.DecryptByte();
          //decrypt with Unprotect method
              byte[] FromByte = ProtectedData.Unprotect(ProtectedByte, null);
          //convert from byte to string
              fText = Encoding.UTF8.GetString(FromByte, 0, FromByte.Length);

              this.Items.Add(new itemView() { LineOne = fname, LineTwo = fText });
      }          
  }

And the other one:

      private byte[] DecryptByte()
  {
      // Access the file in the application's isolated storage.
      IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();

      IsolatedStorageFileStream readstream = new IsolatedStorageFileStream
          ("DataFolder\\"/*Here's where I'm having problems with*/, System.IO.FileMode.Open, FileAccess.Read, file);

      // Read the written data from the file.
      Stream reader = new StreamReader(readstream).BaseStream;
      byte[] dataArray = new byte[reader.Length];
      reader.Read(dataArray, 0, dataArray.Length);
      return dataArray;

  }

So basically the program has a listview page that get's the files from isolated storage. If one is touched, it goes to a new page that shows what's written in it.

Bonus question: Can I encrypt folders in WP7/WP8?

Edit: added one code line into IsoRead.


Solution

  • Xaml:

     <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <StackPanel>
                <Button Content="Write Random File" Click="WriteFile" VerticalAlignment="Top" />
                <Button Content="Read files File" Click="ReadFiles" VerticalAlignment="Top" />
            </StackPanel>
        </Grid>
    

    Code:

    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
    
        private const string FilePath = "{0}.txt";
    
        private readonly List<ItemView> items = new List<ItemView>(); 
    
        private void WriteFile(object sender, RoutedEventArgs e)
        {
            var fileName = DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture);
    
            // Convert text to bytes.
            byte[] data = Encoding.UTF8.GetBytes(fileName);
    
            // Encrypt byutes.
            byte[] protectedBytes = ProtectedData.Protect(data, null);
    
            // Store the encrypted bytes in iso storage.
            this.WriteToFile(protectedBytes, fileName);
        }
    
        private void ReadFiles(object sender, RoutedEventArgs e)
        {
            items.Clear();
    
            using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
            {
                var files = isoStore.GetFileNames("*.txt");
    
                foreach (var file in files)
                {
                    // Retrieve the protected bytes from isolated storage.
                    byte[] protectedBytes = this.ReadBytesFromFile(file);
    
                    // Decrypt the protected bytes by using the Unprotect method.
                    byte[] bytes = ProtectedData.Unprotect(protectedBytes, null);
    
                    // Convert the data from byte to string and display it in the text box.
                    items.Add(new ItemView { LineOne = file, LineTwo = Encoding.UTF8.GetString(bytes, 0, bytes.Length) });
                }
            }
    
            //Show all the data...
            MessageBox.Show(string.Join(",", items.Select(i => i.LineTwo)));
        }
    
        private void WriteToFile(byte[] bytes, string fileName)
        {
            // Create a file in the application's isolated storage.
            using (var file = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (var writestream = new IsolatedStorageFileStream(string.Format(FilePath, fileName), System.IO.FileMode.Create, System.IO.FileAccess.Write, file))
                {
                    // Write data to the file.
                    using (var writer = new StreamWriter(writestream).BaseStream)
                    {
                        writer.Write(bytes, 0, bytes.Length);
                    }
                }
            }
        }
    
        private byte[] ReadBytesFromFile(string filePath)
        {
            // Access the file in the application's isolated storage.
            using (var file = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (var readstream = new IsolatedStorageFileStream(filePath, System.IO.FileMode.Open, FileAccess.Read, file))
                {
                    // Read the data in the file.
                    using (var reader = new StreamReader(readstream).BaseStream)
                    {
                        var ProtectedPinByte = new byte[reader.Length];
    
                        reader.Read(ProtectedPinByte, 0, ProtectedPinByte.Length);
    
                        return ProtectedPinByte;
                    }
                }
            }
        }
    }
    
    public class ItemView
    {
        public string LineOne { get; set; }
        public string LineTwo { get; set; }
    }