Created
November 15, 2013 07:25
-
-
Save thakurarun/7480495 to your computer and use it in GitHub Desktop.
128 bit encryption -AES
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class IrCryptography | |
{ | |
private static readonly int _saltSize = 32; | |
private static string key = System.Configuration.ConfigurationManager.AppSettings["CryptoKey"]; | |
/// <summary> | |
/// Encrypts the plainText input using the given Key. | |
/// A 128 bit random salt will be generated and prepended to the ciphertext before it is base64 encoded. | |
/// </summary> | |
/// <param name="plainText">The plain text to encrypt.</param> | |
/// <param name="key">The plain text encryption key.</param> | |
/// <returns>The salt and the ciphertext, Base64 encoded for convenience.</returns> | |
public static string Encrypt(string plainText) | |
{ | |
if (string.IsNullOrEmpty(plainText)) | |
throw new ArgumentNullException("plainText"); | |
if (string.IsNullOrEmpty(key)) | |
throw new ArgumentNullException("key"); | |
// Derive a new Salt and IV from the Key | |
using (var keyDerivationFunction = new Rfc2898DeriveBytes(key, _saltSize)) | |
{ | |
var saltBytes = keyDerivationFunction.Salt; | |
var keyBytes = keyDerivationFunction.GetBytes(32); | |
var ivBytes = keyDerivationFunction.GetBytes(16); | |
// Create an encryptor to perform the stream transform. | |
// Create the streams used for encryption. | |
using (var aesManaged = new AesManaged()) | |
using (var encryptor = aesManaged.CreateEncryptor(keyBytes, ivBytes)) | |
using (var memoryStream = new MemoryStream()) | |
{ | |
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) | |
using (var streamWriter = new StreamWriter(cryptoStream)) | |
{ | |
// Send the data through the StreamWriter, through the CryptoStream, to the underlying MemoryStream | |
streamWriter.Write(plainText); | |
} | |
// Return the encrypted bytes from the memory stream, in Base64 form so we can send it right to a database (if we want). | |
var cipherTextBytes = memoryStream.ToArray(); | |
Array.Resize(ref saltBytes, saltBytes.Length + cipherTextBytes.Length); | |
Array.Copy(cipherTextBytes, 0, saltBytes, _saltSize, cipherTextBytes.Length); | |
return Convert.ToBase64String(saltBytes); | |
} | |
} | |
} | |
/// <summary> | |
/// Decrypts the ciphertext using the Key. | |
/// </summary> | |
/// <param name="ciphertext">The ciphertext to decrypt.</param> | |
/// <param name="key">The plain text encryption key.</param> | |
/// <returns>The decrypted text.</returns> | |
public static string Decrypt(string ciphertext) | |
{ | |
if (string.IsNullOrEmpty(ciphertext)) | |
throw new ArgumentNullException("cipherText"); | |
if (string.IsNullOrEmpty(key)) | |
throw new ArgumentNullException("key"); | |
// Extract the salt from our ciphertext | |
var allTheBytes = Convert.FromBase64String(ciphertext); | |
var saltBytes = allTheBytes.Take(_saltSize).ToArray(); | |
var ciphertextBytes = allTheBytes.Skip(_saltSize).Take(allTheBytes.Length - _saltSize).ToArray(); | |
using (var keyDerivationFunction = new Rfc2898DeriveBytes(key, saltBytes)) | |
{ | |
// Derive the previous IV from the Key and Salt | |
var keyBytes = keyDerivationFunction.GetBytes(32); | |
var ivBytes = keyDerivationFunction.GetBytes(16); | |
// Create a decrytor to perform the stream transform. | |
// Create the streams used for decryption. | |
// The default Cipher Mode is CBC and the Padding is PKCS7 which are both good | |
using (var aesManaged = new AesManaged()) | |
using (var decryptor = aesManaged.CreateDecryptor(keyBytes, ivBytes)) | |
using (var memoryStream = new MemoryStream(ciphertextBytes)) | |
using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) | |
using (var streamReader = new StreamReader(cryptoStream)) | |
{ | |
// Return the decrypted bytes from the decrypting stream. | |
return streamReader.ReadToEnd(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment