Entiendo usa Rijndael, AES o cualquiera de estos algorítmos, las clases ya están hechas en System.Security.Cryptography y todos funcionan igual, la forma de leer los archivos byte a byte o en array de byte() es System.IO.Stream Aquí te traigo un ejemplo de una función de la Clase Rijndael que hice cuando la necesite:
Este es un ejemplo muy básico tendrás que editarlo un poco porque yo me salte el vector de inicialización usando el MD5 de la llave y otras configuraciones las deje por defecto, te coloco el código como ejemplo porque lo tengo a la mano pero al menos tomate la molestía de ver como funciona
Este es un ejemplo muy básico tendrás que editarlo un poco porque yo me salte el vector de inicialización usando el MD5 de la llave y otras configuraciones las deje por defecto, te coloco el código como ejemplo porque lo tengo a la mano pero al menos tomate la molestía de ver como funciona

Código (vb.net) [Seleccionar]
#Region " Algoritmo Rijndael "
Public Function MD5(ByVal InputStr As String) As String
Dim MD5_Hasher As Cryptography.MD5 = Cryptography.MD5.Create()
Dim [DATA] As Byte() = MD5_Hasher.ComputeHash(Encoding.Default.GetBytes(InputStr))
Dim StrBuild As New StringBuilder()
For x As Integer = 0 To ([DATA].Length - 1)
StrBuild.Append([DATA](x).ToString("x2"))
Next
Return StrBuild.ToString()
End Function
Public Enum RijndaelAction
Crypt
Decrypt
End Enum
Public Function Rijndael(ByVal [Data] As Byte(), ByVal Key As Byte(), ByVal Action As RijndaelAction) As Byte()
Rijndael = New Byte() {}
Dim R As [Rijndael] = Cryptography.Rijndael.Create
With Encoding.Default
R.Key = Key
R.IV = .GetBytes(MD5(.GetString(R.Key)).Substring(0, 16))
Dim ResultStream As New MemoryStream
Dim CryptStream As CryptoStream = Nothing
Select Case Action
Case RijndaelAction.Crypt
CryptStream = New CryptoStream(ResultStream, R.CreateEncryptor, CryptoStreamMode.Write)
Case RijndaelAction.Decrypt
CryptStream = New CryptoStream(ResultStream, R.CreateDecryptor, CryptoStreamMode.Write)
End Select
CryptStream.Write([Data], 0, [Data].Length)
CryptStream.FlushFinalBlock()
Return ResultStream.ToArray
End With
End Function
#End Region