'vb.net file.encrypt not supported workaround

Other threads have covered that file.encrypt on vb is not supported on W7HE. however i cant find a simple work around for it, and the only other function i know for encryption is using:

Imports system.security.Cryptography

and then doing along the lines of

Dim rsa As New RSACryptoServiceProvider
Dim encoder As New UTF8Encoding

etc,etc

however that only does strings, i need to encrypt the file as a whole. Any ideas would be greatly appreciated



Solution 1:[1]

file.encrypt uses EFS, which is actually transparent encryption; the user account stores the master certificate, so anyone logged in under that account can access the file contents in any application. Depending on what you need, that might not be what you want at all. If you want to replicate EFS behavior for your app alone, it's as simple as storing a master password somewhere in the user's private files, split your data file into 'key' and 'data' sections, and encrypt the key with the master password. (Real EFS has some subtleties: It can encrypt the password separately for many different users, so it allows different users access per-file, giving a recovery option in case the main user's password is lost. It also uses the user's password to encrypt the master password, so if anyone changes the password they won't be able to open files.)

The basic method is just prompt the user for the password and use that to encrypt or decrypt the entire file at once rather than a string at a time. Serialize your file however you would unencrypted, then pass that whole byte array to something similar to EncryptStringToBytes_Aes. The one and only difference if you're writing bytes instead of a string is changing:

using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
    {
        swEncrypt.Write(plainText);
    }

to

csEncrypt.Write(plainText);

Either way, for the actual crypto you'd use AesCryptoServiceProvider, not RSACryptoServiceProvider, which is for the top-level authentication and encryption of keys/passwords that get passed to AES and similar algorithms. It's rarely used to encrypt whole files, and is dreadfully slow when you do.

Solution 2:[2]

I'm enclosing a program I wrote to help you along the way. It is very effective and will encrypt whatever you want. I left notes in it to answer all your questions. At the bottom, you will see an added class to reduce memory usage of the program. It works rather well, (by 8% -10%) Enjoy. Items needed: *3 buttons (Browse) (Encrypt) (Decrypt) *1 TextBox For the project video, see my link:

Part 1: https://www.youtube.com/watch?v=sVaA2q8ttzQ

Part 2: https://www.youtube.com/watch?v=TyafeBJ53YU

'Created by: Rythorian77 | github.com/rythorian77
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Public Class Form1


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ramClass As New AESRam()
    End Sub

    Private Sub Browse_Click(sender As Object, e As EventArgs) Handles Browse.Click

        'Allows you to access files from folders
        Dim fetchCryptDialog As New OpenFileDialog With {
            .CheckFileExists = True,
            .InitialDirectory = "C:\",
        .Multiselect = False
        }

        If fetchCryptDialog.ShowDialog = DialogResult.OK Then
            TextBox1.Text = fetchCryptDialog.FileName
        End If

    End Sub

    Private Sub Encrypt_Click(sender As Object, e As EventArgs) Handles Encrypt.Click

        'File path goes to textbox
        Dim Rythorian77 As String = TextBox1.Text

        'This password can be whater you want.
        Dim password As String = "123456789ABCDEFG!@#$%^&*()_+"

        'A data type is the characteristic of a variable that determines what kind of data it can hold.
        'Data types include those in the following table as well as user-defined types and specific types of objects.
        Dim key As Byte() = New Byte(31) {}

        'When overridden in a derived class, encodes a set of characters into a sequence of bytes.
        Encoding.Default.GetBytes(password).CopyTo(key, 0)

        'RijndaelManaged still works but is considered obsolete in todays world so we use AES
        'Represents the abstract base class from which all implementations of the Advanced Encryption Standard (AES) must inherit.
        'https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.aes?view=net-6.0
        Dim aes As New RijndaelManaged() With
            {
                .Mode = CipherMode.CBC,
                .KeySize = 256,
                .BlockSize = 256,
                .Padding = PaddingMode.Zeros
            }

        'Reads a sequence of bytes from the current memory stream and advances the position within the memory stream by the number of bytes read. 
        Using mnemonicData As New MemoryStream

            'Defines a stream that links data streams to cryptographic transformations.
            Using cStream As New CryptoStream(mnemonicData, aes.CreateEncryptor(key, key), CryptoStreamMode.Write)
                Dim buffer As Byte() = File.ReadAllBytes(Rythorian77)
                cStream.Write(buffer, 0, buffer.Length)
                Dim appendBuffer As Byte() = mnemonicData.ToArray()
                Dim finalBuffer As Byte() = New Byte(appendBuffer.Length - 1) {}
                appendBuffer.CopyTo(finalBuffer, 0)
                File.WriteAllBytes(Rythorian77, finalBuffer)

            End Using
        End Using

    End Sub
 'The above code notes compliment the same
    Private Sub Decrypt_Click(sender As Object, e As EventArgs) Handles Decrypt.Click
        Dim Rythorian77 As String = TextBox1.Text

        Dim password As String = "123456789ABCDEFG!@#$%^&*()_+"

        Dim key As Byte() = New Byte(31) {}

        Encoding.Default.GetBytes(password).CopyTo(key, 0)

        Dim aes As New RijndaelManaged() With
            {
                .Mode = CipherMode.CBC,
                .KeySize = 256,
                .BlockSize = 256,
                .Padding = PaddingMode.Zeros
            }

        Using mnemonicData As New MemoryStream
            '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    < aes.CreateDecryptor > is the only change from above aes.CreateEncryptor
            Using cStream As New CryptoStream(mnemonicData, aes.CreateDecryptor(key, key), CryptoStreamMode.Write)
                Dim buffer As Byte() = File.ReadAllBytes(Rythorian77)
                cStream.Write(buffer, 0, buffer.Length)
                Dim appendBuffer As Byte() = mnemonicData.ToArray()
                Dim finalBuffer As Byte() = New Byte(appendBuffer.Length - 1) {}
                appendBuffer.CopyTo(finalBuffer, 0)
                File.WriteAllBytes(Rythorian77, finalBuffer)

            End Using
        End Using

    End Sub

End Class



**Add this separate Class:**

Imports System.Runtime.InteropServices

Public Class AESRam

    'This controls the amount of RAM that your process uses, it doesn't otherwise have any affect on the virtual memory size of your process. 
    'Sets the minimum and maximum working set sizes for the specified process.
    'This will cut memory usage in half.
    <DllImport("KERNEL32.DLL", EntryPoint:="SetProcessWorkingSetSize", SetLastError:=True, CallingConvention:=CallingConvention.StdCall)>
    Friend Shared Function SetProcessWorkingSetSize(pProcess As IntPtr, dwMinimumWorkingSetSize As Integer, dwMaximumWorkingSetSize As Integer) As Boolean
    End Function

    'Retrieves a pseudo handle for the current process.
    <DllImport("KERNEL32.DLL", EntryPoint:="GetCurrentProcess", SetLastError:=True, CallingConvention:=CallingConvention.StdCall)>
    Friend Shared Function GetCurrentProcess() As IntPtr
    End Function

    'See Above
    Public Sub New()
        Dim pHandle As IntPtr = GetCurrentProcess()
        SetProcessWorkingSetSize(pHandle, -1, -1)
    End Sub

End Class

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 SilverbackNet
Solution 2