// See https://aka.ms/new-console-template for more information using System.Security.Cryptography; string keyBase64; string cipherText; string vectorBase64; string plainText; Console.WriteLine("Welcome to the Aes Encryption/Decryption tool"); Select: Console.WriteLine("Please select the action you want to perform: /n Press 1 to Generate Key. /n Press 2 to Encrypt using the key. /n Press 3 to Decrpt using the key."); string? action = Console.ReadLine(); if (action == null || !int.TryParse(action, out int actionId) || !new List{ 1, 2, 3 }.Contains(actionId)) { Console.WriteLine("Invalid option. /n"); goto Select; } switch (actionId) { case 1: Console.WriteLine("Creating Aes Encryption 256 bit key"); using (Aes aesAlgorithm = Aes.Create()) { aesAlgorithm.KeySize = 256; aesAlgorithm.GenerateKey(); keyBase64 = Convert.ToBase64String(aesAlgorithm.Key); Console.WriteLine($"Aes Key Size : {aesAlgorithm.KeySize}"); Console.WriteLine("Here is the Aes key in Base64:"); Console.WriteLine(keyBase64); } break; case 2: Console.WriteLine("Encrypt Text"); Console.WriteLine("Provide the Aes Key in base64 format :"); keyBase64 = Console.ReadLine(); Console.WriteLine("--------------------------------------------------------------"); Console.WriteLine("Please enter the text that you want to encrypt:"); plainText = Console.ReadLine(); Console.WriteLine("--------------------------------------------------------------"); cipherText = EncryptDataWithAes(plainText, keyBase64, out vectorBase64); Console.WriteLine("--------------------------------------------------------------"); Console.WriteLine("Here is the cipher text with vector:"); Console.WriteLine(cipherText + ":" + vectorBase64); break; case 3: Console.WriteLine("Please enter the text that you want to decrypt:"); cipherText = Console.ReadLine(); Console.WriteLine("--------------------------------------------------------------"); Console.WriteLine("Provide the Aes Key:"); keyBase64 = Console.ReadLine(); Console.WriteLine("--------------------------------------------------------------"); vectorBase64 = cipherText.Split(":")[1]; cipherText = cipherText.Split(":")[0]; plainText = DecryptDataWithAes(cipherText, keyBase64, vectorBase64); Console.WriteLine("--------------------------------------------------------------"); Console.WriteLine("Here is the decrypted data:"); Console.WriteLine(plainText); break; } goto Select; static string EncryptDataWithAes(string plainText, string keyBase64, out string vectorBase64) { using (Aes aesAlgorithm = Aes.Create()) { aesAlgorithm.Key = Convert.FromBase64String(keyBase64); aesAlgorithm.GenerateIV(); Console.WriteLine($"Aes Cipher Mode : {aesAlgorithm.Mode}"); Console.WriteLine($"Aes Padding Mode: {aesAlgorithm.Padding}"); Console.WriteLine($"Aes Key Size : {aesAlgorithm.KeySize}"); //set the parameters with out keyword vectorBase64 = Convert.ToBase64String(aesAlgorithm.IV); // Create encryptor object ICryptoTransform encryptor = aesAlgorithm.CreateEncryptor(); byte[] encryptedData; //Encryption will be done in a memory stream through a CryptoStream object using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { using (StreamWriter sw = new StreamWriter(cs)) { sw.Write(plainText); } encryptedData = ms.ToArray(); } } return Convert.ToBase64String(encryptedData); } } static string DecryptDataWithAes(string cipherText, string keyBase64, string vectorBase64) { using (Aes aesAlgorithm = Aes.Create()) { aesAlgorithm.Key = Convert.FromBase64String(keyBase64); aesAlgorithm.IV = Convert.FromBase64String(vectorBase64); Console.WriteLine($"Aes Cipher Mode : {aesAlgorithm.Mode}"); Console.WriteLine($"Aes Padding Mode: {aesAlgorithm.Padding}"); Console.WriteLine($"Aes Key Size : {aesAlgorithm.KeySize}"); Console.WriteLine($"Aes Block Size : {aesAlgorithm.BlockSize}"); // Create decryptor object ICryptoTransform decryptor = aesAlgorithm.CreateDecryptor(); byte[] cipher = Convert.FromBase64String(cipherText); //Decryption will be done in a memory stream through a CryptoStream object using (MemoryStream ms = new MemoryStream(cipher)) { using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cs)) { return sr.ReadToEnd(); } } } } }