Skip to content

Instantly share code, notes, and snippets.

@RichardHan
Created February 8, 2016 09:22
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save RichardHan/0848a25d9466a21f1f38 to your computer and use it in GitHub Desktop.
Save RichardHan/0848a25d9466a21f1f38 to your computer and use it in GitHub Desktop.
C# AES sample code
using System;
using System.IO;
using System.Security.Cryptography;
namespace AES
{
class Program
{
static string aes_key = "AXe8YwuIn1zxt3FPWTZFlAa14EHdPAdN9FaZ9RQWihc=";
static string aes_iv = "bsxnWolsAyO7kCfWuyrnqg==";
static void Main(string[] args)
{
string original = "Here is some data to encrypt!";
try
{
// Encrypt the string to an array of bytes.
byte[] encrypted = EncryptStringToBytes(original, Convert.FromBase64String(aes_key), Convert.FromBase64String(aes_iv));
// Decrypt the bytes to a string.
string roundtrip = DecryptStringFromBytes(encrypted, Convert.FromBase64String(aes_key), Convert.FromBase64String(aes_iv));
//Display the original data and the decrypted data.
Console.WriteLine("Original: {0}", original);
Console.WriteLine("Round Trip: {0}", roundtrip);
Console.WriteLine("===========================");
// Encrypt the string to an array of bytes.
string str_encrypted = EncryptAES(original);
// Decrypt the bytes to a string.
string str_roundtrip = DecryptAES(str_encrypted);
Console.WriteLine("Original: {0}", str_encrypted);
Console.WriteLine("Round Trip: {0}", str_roundtrip);
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
}
public static string EncryptAES(string plainText)
{
byte[] encrypted;
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.Key = Convert.FromBase64String(aes_key);
aes.IV = Convert.FromBase64String(aes_iv);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform enc = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, enc, CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(plainText);
}
encrypted = ms.ToArray();
}
}
}
return Convert.ToBase64String(encrypted);
}
public static string DecryptAES(string encryptedText)
{
string decrypted = null;
byte[] cipher = Convert.FromBase64String(encryptedText);
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.Key = Convert.FromBase64String(aes_key);
aes.IV = Convert.FromBase64String(aes_iv);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform dec = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream ms = new MemoryStream(cipher))
{
using (CryptoStream cs = new CryptoStream(ms, dec, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs))
{
decrypted = sr.ReadToEnd();
}
}
}
}
return decrypted;
}
static byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
{
// Check arguments.
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
byte[] encrypted;
// Create an RijndaelManaged object
// with the specified key and IV.
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
rijAlg.Key = Key;
rijAlg.IV = IV;
// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
// Return the encrypted bytes from the memory stream.
return encrypted;
}
static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
// Create an RijndaelManaged object
// with the specified key and IV.
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
rijAlg.Key = Key;
rijAlg.IV = IV;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
}
}
@soondook
Copy link

soondook commented May 9, 2020

function Encrypt-Data($AesKey, $Data) {
    $Data = [System.Text.Encoding]::UTF8.GetBytes($Data)
    $AesManaged = New-Object "System.Security.Cryptography.AesManaged"
    $AesManaged.Mode = [System.Security.Cryptography.CipherMode]::CBC
    $AesManaged.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
    $AesManaged.BlockSize = 128
    $AesManaged.KeySize = 256
    $AesManaged.IV = [System.Convert]::FromBase64String("1RPs2B3grDEKLjiLmfVMjw==")
    $AesManaged.Key = [System.Convert]::FromBase64String("wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=")
     $Encryptor = $AesManaged.CreateEncryptor()
    $EncryptedData = $Encryptor.TransformFinalBlock($Data, 0, $Data.Length);
    [byte[]] $EncryptedData = $AesManaged.Key + $EncryptedData
    #[System.Convert]::ToBase64String($AesManaged.IV)
    $AesManaged.Dispose()
    [System.Convert]::ToBase64String($EncryptedData)
}

function Decrypt-Data($AesKey, $Data) {
    $Data = [System.Convert]::FromBase64String($Data)
    $AesManaged = New-Object "System.Security.Cryptography.AesManaged"
    $AesManaged.Mode = [System.Security.Cryptography.CipherMode]::CBC
    $AesManaged.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
    $AesManaged.BlockSize = 128
    $AesManaged.KeySize = 256
    $AesManaged.IV = [System.Convert]::FromBase64String("1RPs2B3grDEKLjiLmfVMjw==")
    $AesManaged.Key = [System.Convert]::FromBase64String($AesKey)
    $Decryptor = $AesManaged.CreateDecryptor();
    $DecryptedData = $Decryptor.TransformFinalBlock($Data, 16, $Data.Length - 16);
    $aesManaged.Dispose()
    [System.Text.Encoding]::UTF8.GetString($DecryptedData)
   #Create-AesKey 256
  $encrypted = Encrypt-Data "wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=" "Hello World!"
  decrypted = Decrypt-Data "wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=" "1RPs2B3grDEKLjiLmfVMjzz9A+Y/7FD+Gx57fUL9SGY="

Thanks for the nice code!
Please tell me how I can modify your C # code, similarly to the Powershell encrypted function ...?
Powershell encryption function, each time returns a different encrypted string "Hello World!".
1RPs2B3grDEKLjiLmfVMjzz9A+Y/7FD+Gx57fUL9SGY=
This is very good, because with each iteration we get completely different values ​​of the encrypted string!

Your C # code returns only the single-static value of the string "Hello World!":
Original: PP0D5j/sUP4bHnt9Qv1IZg==

with best regards!

@Zubastic
Copy link

Zubastic commented Feb 1, 2024

function Encrypt-Data($AesKey, $Data) {
    $Data = [System.Text.Encoding]::UTF8.GetBytes($Data)
    $AesManaged = New-Object "System.Security.Cryptography.AesManaged"
    $AesManaged.Mode = [System.Security.Cryptography.CipherMode]::CBC
    $AesManaged.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
    $AesManaged.BlockSize = 128
    $AesManaged.KeySize = 256
    $AesManaged.IV = [System.Convert]::FromBase64String("1RPs2B3grDEKLjiLmfVMjw==")
    $AesManaged.Key = [System.Convert]::FromBase64String("wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=")
     $Encryptor = $AesManaged.CreateEncryptor()
    $EncryptedData = $Encryptor.TransformFinalBlock($Data, 0, $Data.Length);
    [byte[]] $EncryptedData = $AesManaged.Key + $EncryptedData
    #[System.Convert]::ToBase64String($AesManaged.IV)
    $AesManaged.Dispose()
    [System.Convert]::ToBase64String($EncryptedData)
}

function Decrypt-Data($AesKey, $Data) {
    $Data = [System.Convert]::FromBase64String($Data)
    $AesManaged = New-Object "System.Security.Cryptography.AesManaged"
    $AesManaged.Mode = [System.Security.Cryptography.CipherMode]::CBC
    $AesManaged.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
    $AesManaged.BlockSize = 128
    $AesManaged.KeySize = 256
    $AesManaged.IV = [System.Convert]::FromBase64String("1RPs2B3grDEKLjiLmfVMjw==")
    $AesManaged.Key = [System.Convert]::FromBase64String($AesKey)
    $Decryptor = $AesManaged.CreateDecryptor();
    $DecryptedData = $Decryptor.TransformFinalBlock($Data, 16, $Data.Length - 16);
    $aesManaged.Dispose()
    [System.Text.Encoding]::UTF8.GetString($DecryptedData)
   #Create-AesKey 256
  $encrypted = Encrypt-Data "wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=" "Hello World!"
  decrypted = Decrypt-Data "wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=" "1RPs2B3grDEKLjiLmfVMjzz9A+Y/7FD+Gx57fUL9SGY="

Thanks for the nice code! Please tell me how I can modify your C # code, similarly to the Powershell encrypted function ...? Powershell encryption function, each time returns a different encrypted string "Hello World!". 1RPs2B3grDEKLjiLmfVMjzz9A+Y/7FD+Gx57fUL9SGY= This is very good, because with each iteration we get completely different values ​​of the encrypted string!

Your C # code returns only the single-static value of the string "Hello World!":

Original: PP0D5j/sUP4bHnt9Qv1IZg==

with best regards!

After 4 years fixed code:

function Encrypt-Data($key, $data) {
    $bytes = [System.Text.Encoding]::UTF8.GetBytes($data)
    $aes = [System.Security.Cryptography.AesManaged]::new()
    $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
    $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
    $aes.BlockSize = 128
    $aes.KeySize = 256
    $aes.IV = [System.Convert]::FromBase64String("1RPs2B3grDEKLjiLmfVMjw==")
    $aes.Key = [System.Convert]::FromBase64String($key)
     $Encryptor = $aes.CreateEncryptor()
    $EncryptedData = $Encryptor.TransformFinalBlock($bytes, 0, $bytes.Length);
    [byte[]] $EncryptedData = $EncryptedData
    $aes.Dispose()
    return [System.Convert]::ToBase64String($EncryptedData)
}

function Decrypt-Data($key, $data) {
    $bytes = [System.Convert]::FromBase64String($data)
    $aes = [System.Security.Cryptography.AesManaged]::new()
    $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
    $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
    $aes.BlockSize = 128
    $aes.KeySize = 256
    $aes.IV = [System.Convert]::FromBase64String("1RPs2B3grDEKLjiLmfVMjw==")
    $aes.Key = [System.Convert]::FromBase64String($key)
    $dec = $aes.CreateDecryptor();
    $value = $dec.TransformFinalBlock($bytes, 0, $bytes.Length);
    $aes.Dispose()
    return [System.Text.Encoding]::UTF8.GetString($value)
}

#Create-AesKey 256
$encrypted = Encrypt-Data "wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=" "Hello World!"
$decrypted = Decrypt-Data "wQpxkQNAxqULHUsAy/cuTnzyrF1LYGLkbOyozXv6Kag=" $encrypted

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment