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.GetUserStoreForApplication()
Private Const PasswordSalt As String = "PasswordSalt"
Private Shared sourceFilePath As String = ""
Private Shared signedFilePath As String = ""
Public Sub New()
InitializeComponent()
AddHandler Me.inputBox.KeyDown, AddressOf inputBox_KeyDown
AddHandler Me.passwordBox.KeyDown, AddressOf passwordBox_KeyDown
AddHandler Me.decodePassWordBox.KeyDown, AddressOf decodePassWordBox_KeyDown
AddHandler Me.deleteBox.KeyDown, AddressOf deleteBox_KeyDown
AddHandler Me.decodeBox.KeyDown, AddressOf decodeBox_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
CreateFile()
Me.passwordBox.Focus()
End If
End Sub 'inputBox_KeyDown
Private Sub decodeBox_KeyDown(ByVal sender As Object, ByVal e As EventArgs)
If CType(e, System.Windows.Input.KeyEventArgs).Key = Key.Enter Then
Dim store As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
signedFilePath = System.IO.Path.Combine(encryptedFiles, "signedFile.txt")
Me.decodePassWordBox.Focus()
End If
End Sub 'decodeBox_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
Try
' Create a random key using a random number generator. This would be the
' secret key shared by sender and receiver.
Dim secretkey() As Byte = New [Byte](63) {}
Dim deriveBytes As New Rfc2898DeriveBytes(passwordBox.Password, Encoding.UTF8.GetBytes(PasswordSalt))
secretkey = deriveBytes.GetBytes(64)
' Use the secret key to encode the message file.
EncodeFile(secretkey, sourceFilePath, signedFilePath)
Catch ex As Exception
outputBlock.Text = ex.Message
End Try
Me.decodePassWordBox.Focus()
End If
End Sub 'passwordBox_KeyDown
Private Sub decodePassWordBox_KeyDown(ByVal sender As Object, ByVal e As EventArgs)
If CType(e, System.Windows.Input.KeyEventArgs).Key = Key.Enter Then
Try
' Create a random key using a random number generator. This would be the
' secret key shared by sender and receiver.
Dim secretkey() As Byte = New [Byte](63) {}
Dim deriveBytes As New Rfc2898DeriveBytes(passwordBox.Password, Encoding.UTF8.GetBytes(PasswordSalt))
secretkey = deriveBytes.GetBytes(64)
' Take the encoded file and decode
DecodeFile(secretkey, signedFilePath)
Catch ex As Exception
outputBlock.Text = ex.Message
End Try
Me.deleteBox.Focus()
End If
End Sub 'decodePassWordBox_KeyDown
' Computes a keyed hash for a source file, creates a target file with the keyed hash
' prepended to the contents of the source file
Public Sub EncodeFile(ByVal key() As Byte, ByVal sourceFile As String, ByVal destFile As String)
Dim isoStore As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Try
Dim outStream As IsolatedStorageFileStream = isoStore.OpenFile(signedFilePath, FileMode.Open)
Try
Try
' Initialize the keyed hash object.
Dim myhmacsha256 As New HMACSHA256(key)
Dim inStream As IsolatedStorageFileStream = isoStore.OpenFile(sourceFilePath, FileMode.Open)
inStream.Position = 0
' Compute the hash of the input file.
Dim hashValue As Byte() = myhmacsha256.ComputeHash(inStream)
' Reset inStream to the beginning of the file.
inStream.Position = 0
' Write the computed hash value to the output file.
outStream.Write(hashValue, 0, hashValue.Length)
' Copy the contents of the sourceFile to the destFile.
Dim bytesRead As Integer
' read 1K at a time
Dim buffer(1023) As Byte
Do
' Read from the wrapping CryptoStream.
bytesRead = inStream.Read(buffer, 0, 1024)
outStream.Write(buffer, 0, bytesRead)
Loop While bytesRead > 0
myhmacsha256.Clear()
' Close the streams
inStream.Close()
outStream.Close()
decodeBox.Text = destFile.Replace(encryptedFiles + "\", "")
decodePassWordBox.Focus()
Return
Catch e As Exception
outputBlock.Text = e.Message
End Try
Finally
outStream.Dispose()
End Try
Finally
isoStore.Dispose() 'end if-else
End Try
End Sub 'EncodeFile
' end EncodeFile
' Decode the encoded file and compare to original file.
Public Function DecodeFile(ByVal key() As Byte, ByVal sourceFile As String) As Boolean
Dim isoStore As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Try
Dim inStream As IsolatedStorageFileStream = isoStore.OpenFile(signedFilePath, FileMode.Open)
Try
Try
' Initialize the keyed hash object.
Dim hmacsha256 As New HMACSHA256(key)
' Create an array to hold the keyed hash value read from the file.
Dim storedHash(hmacsha256.HashSize / 8 - 1) As Byte
' Create a FileStream for the source file
' Read in the storedHash.
inStream.Read(storedHash, 0, storedHash.Length)
' Compute the hash of the remaining contents of the file.
' The stream is properly positioned at the beginning of the content,
' immediately after the stored hash value.
Dim computedHash As Byte() = hmacsha256.ComputeHash(inStream)
' compare the computed hash with the stored value
Dim i As Integer
For i = 1 To storedHash.Length - 1
If computedHash(i) <> storedHash(i) Then
outputBlock.Text = "Hash values differ! Either wrong password or file has changed."
Return False
End If
Next i
outputBlock.Text = "Hash values agree -- no tampering occurred."
Return True
Catch e As Exception
outputBlock.Text = e.Message
Return False
End Try
Finally
inStream.Dispose()
End Try
Finally
isoStore.Dispose()
End Try
'end DecodeFile
End Function 'DecodeFile
Public Sub CreateFile()
Dim store As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
sourceFilePath = System.IO.Path.Combine(encryptedFiles, "sourceFile.txt")
signedFilePath = System.IO.Path.Combine(encryptedFiles, "signedFile.txt")
Dim sourceStream As IsolatedStorageFileStream = store.CreateFile(sourceFilePath)
Dim sw As New StreamWriter(sourceStream)
sw.WriteLine(inputBox.Text)
sw.Close()
sourceStream.Close()
Dim signedStream As IsolatedStorageFileStream = store.CreateFile(signedFilePath)
signedStream.Close()
decodeBox.Text = "sourceFile.txt"
End Sub 'CreateFile
End Class 'Page