Instantly share code, notes, and snippets.

Embed
What would you like to do?
Simple (non-AEAD) c# helper console app
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace SimpleAES
{
class Program
{
/// <summary>
///
/// </summary>
const int ReadBufferSize = 512 * 1024;
/// <summary>
/// entrypoint
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
if (args.Length < 1)
{
Console.WriteLine("Usage: SimpleAES.exe -encrypt [src] [dst] [key] [iv]");
Console.WriteLine(" -decrypt [src] [dst] [key] [iv]");
Console.WriteLine(" -base64encode [src] [dst]");
Console.WriteLine(" -base64decode [src] [dst]");
Console.WriteLine(" -tohex [value]\n");
Console.WriteLine("Note: [key] argument should be supplied in hex (i.e. FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF) and should be either 128 or 256 bits");
Console.WriteLine(" [iv] argument should be supplied in hex (i.e. 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00) and should be 128 bits");
return;
}
try
{
var action = args[0].Substring(1).ToLower();
switch (action)
{
case "encrypt":
case "decrypt":
{
var key = args[3].Split('-').Select(b => Convert.ToByte(b, 16)).ToArray();
var iv = args[4].Split('-').Select(b => Convert.ToByte(b, 16)).ToArray();
if (action == "encrypt")
{
EncryptFile(args[1], args[2], key, iv);
}
else
{
DecryptFile(args[1], args[2], key, iv);
}
break;
}
case "base64encode":
{
Base64Encode(args[1], args[2]);
break;
}
case "base64decode":
{
Base64Decode(args[1], args[2]);
break;
}
case "tohex":
{
Console.WriteLine(BitConverter.ToString(Encoding.ASCII.GetBytes(args[1])));
break;
}
default:
{
Console.WriteLine("Invalid Option");
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: {0}", ex.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="sourceFile"></param>
/// <param name="destinationFile"></param>
/// <param name="key">128 bit, or 256 bit key (16/32 chars)</param>
/// <param name="iv">128 bit derived initialisation vector (16 chars)</param>
/// <returns></returns>
static void EncryptFile(string sourceFile, string destinationFile, byte[] key, byte[] iv)
{
var sourceFileLength = new FileInfo(sourceFile).Length;
using (var aes = new AesCryptoServiceProvider())
{
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = (key.Length * 8);
Console.WriteLine("AesKey : {0}", BitConverter.ToString(key));
Console.WriteLine("AesIV : {0}", BitConverter.ToString(iv));
using (var dstFile = new FileStream(destinationFile, FileMode.Create))
{
using (var encryptor = aes.CreateEncryptor(key, iv))
{
using (var cs = new CryptoStream(dstFile, encryptor, CryptoStreamMode.Write))
{
using (var srcFile = new FileStream(sourceFile, FileMode.Open))
{
Console.WriteLine("AesEncryptStart ({0} / {1} / {2} bit)", aes.Mode, aes.Padding, aes.KeySize);
Console.WriteLine("{0}/{1} bytes", 0, sourceFileLength);
int bytes;
var buffer = new byte[ReadBufferSize];
Int64 totalBytes = 0;
while ((bytes = srcFile.Read(buffer, 0, buffer.Length)) > 0)
{
totalBytes += bytes;
cs.Write(buffer, 0, bytes);
Console.WriteLine("{0}/{1}", totalBytes, sourceFileLength);
}
Console.WriteLine("AesEncryptComplete");
}
}
}
}
}
}
/// <summary>
///
/// </summary>
/// <param name="sourceFile"></param>
/// <param name="destinationFile"></param>
/// <param name="key">128 bit, or 256 bit key (16/32 chars)</param>
/// <param name="iv">128 bit derived initialisation vector (16 chars)</param>
static void DecryptFile(string sourceFile, string destinationFile, byte[] key, byte[] iv)
{
var sourceFileLength = new FileInfo(sourceFile).Length;
using (var aes = new AesCryptoServiceProvider())
{
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = (key.Length * 8);
Console.WriteLine("AesKey : {0}", BitConverter.ToString(key));
Console.WriteLine("AesIV : {0}", BitConverter.ToString(iv));
using (var srcFile = new FileStream(sourceFile, FileMode.Open))
{
using (var dstFile = new FileStream(destinationFile, FileMode.Create))
{
using (var decryptor = aes.CreateDecryptor(key, iv))
{
using (var cs = new CryptoStream(srcFile, decryptor, CryptoStreamMode.Read))
{
Console.WriteLine("AesDecryptStart ({0} / {1} / {2} bit)", aes.Mode, aes.Padding, aes.KeySize);
Console.WriteLine("{0}/{1} bytes", 0, sourceFileLength);
int bytes;
var buffer = new byte[4096];
Int64 totalBytes = 0;
while ((bytes = cs.Read(buffer, 0, buffer.Length)) > 0)
{
totalBytes += bytes;
dstFile.Write(buffer, 0, bytes);
Console.WriteLine("{0}/{1}", totalBytes, sourceFileLength);
}
Console.WriteLine("AesDecryptComplete");
}
}
}
}
}
}
/// <summary>
///
/// </summary>
/// <param name="sourceFile"></param>
/// <param name="destinationFile"></param>
static void Base64Encode(string sourceFile, string destinationFile)
{
var dataIn = new byte[new FileInfo(sourceFile).Length];
using (var srcFile = new FileStream(sourceFile, FileMode.Open))
{
using (var dstFile = new FileStream(destinationFile, FileMode.Create))
{
srcFile.Read(dataIn, 0, dataIn.Length);
var dataOut = Convert.ToBase64String(dataIn, 0, dataIn.Length);
dstFile.Write(Encoding.UTF8.GetBytes(dataOut), 0, dataOut.Length);
}
}
}
/// <summary>
///
/// </summary>
/// <param name="sourceFile"></param>
/// <param name="destinationFile"></param>
static void Base64Decode(string sourceFile, string destinationFile)
{
var dataIn = new byte[new FileInfo(sourceFile).Length];
using (var srcFile = new FileStream(sourceFile, FileMode.Open))
{
using (var dstFile = new FileStream(destinationFile, FileMode.Create))
{
srcFile.Read(dataIn, 0, dataIn.Length);
var dataOut = Convert.FromBase64String(Encoding.UTF8.GetString(dataIn));
dstFile.Write(dataOut, 0, dataOut.Length);
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment