Imports System
Imports System.Windows.Controls
Imports System.Windows.Input
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security.Cryptography
Imports System.Security.Permissions
Imports System.Text
Class MainPage
Inherits UserControl
Private Shared encryptedFiles As String = ""
Private Shared store As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForSite()
Private Const PasswordSalt As String = "PasswordSalt"
Private Shared intSize As Integer = 4
Public Sub New()
InitializeComponent()
AddHandler Me.inputBox.KeyDown, AddressOf inputBox_KeyDown
AddHandler Me.passwordBox.KeyDown, AddressOf passwordBox_KeyDown
AddHandler Me.decryptPassWordBox.KeyDown, AddressOf decryptPassWordBox_KeyDown
AddHandler Me.deleteBox.KeyDown, AddressOf deleteBox_KeyDown
store.CreateDirectory("MyFiles")
' Create subdirectory under MyFiles.
encryptedFiles = System.IO.Path.Combine("MyFiles", "EncryptedFiles")
store.CreateDirectory(encryptedFiles)
ListFiles()
inputBox.Focus()
End Sub 'New
Private Sub inputBox_KeyDown(ByVal sender As Object, ByVal e As EventArgs)
If CType(e, System.Windows.Input.KeyEventArgs).Key = Key.Enter Then
Me.passwordBox.Focus()
End If
End Sub 'inputBox_KeyDown
Private Sub ListFiles()
Dim searchpath As String = System.IO.Path.Combine(encryptedFiles, "*.*")
Dim filesInSubDirs As String() = store.GetFileNames(searchpath)
Dim sb As New StringBuilder()
' List files in MyFiles\EncryptedFiles.
sb.AppendLine("Files in MyFiles\EncryptedFiles:")
Dim fileName As String
For Each fileName In filesInSubDirs
sb.AppendLine(" - " + fileName)
Next fileName
sb.AppendLine()
outputBlock.Text = sb.ToString()
End Sub 'ListFiles
Private Sub deleteBox_KeyDown(ByVal sender As Object, ByVal e As EventArgs)
If CType(e, System.Windows.Input.KeyEventArgs).Key = Key.Enter Then
store.DeleteFile(encryptedFiles + "\" + deleteBox.Text)
ListFiles()
Me.passwordBox.Focus()
End If
End Sub 'deleteBox_KeyDown
Private Sub passwordBox_KeyDown(ByVal sender As Object, ByVal e As EventArgs)
If CType(e, System.Windows.Input.KeyEventArgs).Key = Key.Enter Then
Encrypt()
Me.decryptBox.Focus()
End If
End Sub 'passwordBox_KeyDown
Private Sub decryptPassWordBox_KeyDown(ByVal sender As Object, ByVal e As EventArgs)
If CType(e, System.Windows.Input.KeyEventArgs).Key = Key.Enter Then
outputBlock.Text = Decrypt()
Me.deleteBox.Focus()
End If
End Sub 'decryptPassWordBox_KeyDown
Private Function Decrypt() As String
Dim store As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Dim encryptedFiles As String = System.IO.Path.Combine("MyFiles", "EncryptedFiles")
store.CreateDirectory(encryptedFiles)
Dim xFilePath As String = System.IO.Path.Combine(encryptedFiles, decryptBox.Text)
Using isoStore As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Using isoStoreStream As IsolatedStorageFileStream = isoStore.OpenFile(xFilePath, FileMode.Open)
Using aes = New System.Security.Cryptography.AesManaged()
Dim deriveBytes As New Rfc2898DeriveBytes(decryptPassWordBox.Password, Encoding.UTF8.GetBytes(PasswordSalt))
aes.Key = deriveBytes.GetBytes(128 / 8)
' Get the initialization vector from the encrypted stream
aes.IV = ReadByteArray(isoStoreStream)
Dim cs As New CryptoStream(isoStoreStream, aes.CreateDecryptor(), CryptoStreamMode.Read)
Dim reader As New StreamReader(cs, Encoding.Unicode)
Try
Dim retval As String
retval = reader.ReadToEnd()
reader.Dispose()
cs.Dispose()
Return retval
Catch e As Exception
Return e.ToString()
End Try
End Using
End Using
End Using
End Function 'Decrypt
Private Sub Encrypt()
Dim store As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Dim encryptedFiles As String = System.IO.Path.Combine("MyFiles", "EncryptedFiles")
store.CreateDirectory(encryptedFiles)
Dim xFilePath As String = System.IO.Path.Combine(encryptedFiles, "encryptedFile.txt")
Dim xStream As IsolatedStorageFileStream = store.CreateFile(xFilePath)
xStream.Close()
decryptBox.Text = "encryptedFile.txt"
Using isoStore As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Using isoStoreStream As IsolatedStorageFileStream = isoStore.OpenFile(xFilePath, FileMode.Create)
Using aes = New System.Security.Cryptography.AesManaged()
Dim deriveBytes As New Rfc2898DeriveBytes(passwordBox.Password, Encoding.UTF8.GetBytes(PasswordSalt))
aes.Key = deriveBytes.GetBytes(128 / 8)
If Integer.MaxValue = Int64.MaxValue Then intSize = 8
isoStoreStream.Write(BitConverter.GetBytes(aes.IV.Length), 0, intSize)
isoStoreStream.Write(aes.IV, 0, aes.IV.Length)
Using cs As New CryptoStream(isoStoreStream, aes.CreateEncryptor(), CryptoStreamMode.Write)
Dim rawPlaintext As Byte() = Encoding.Unicode.GetBytes(inputBox.Text)
cs.Write(rawPlaintext, 0, rawPlaintext.Length)
cs.FlushFinalBlock()
End Using
End Using
End Using
End Using
xStream.Close()
xStream = store.OpenFile(System.IO.Path.Combine(encryptedFiles, "encryptedFile.txt"), FileMode.Open)
Dim reader As New StreamReader(xStream)
' Read the data.
Me.outputBlock.Text = reader.ReadToEnd()
reader.Close()
xStream.Close()
End Sub 'Encrypt
Private Shared Function ReadByteArray(ByVal s As Stream) As Byte()
If Integer.MaxValue = Int64.MaxValue Then intSize = 8
Dim rawLength(intSize - 1) As Byte
If s.Read(rawLength, 0, rawLength.Length) <> rawLength.Length Then
Throw New SystemException("Stream did not contain properly formatted byte array")
End If
Dim buffer(BitConverter.ToInt32(rawLength, 0) - 1) As Byte
If s.Read(buffer, 0, buffer.Length) <> buffer.Length Then
Throw New SystemException("Did not read byte array properly")
End If
Return buffer
End Function 'ReadByteArray
End Class 'Page