Created
September 5, 2013 20:12
-
-
Save feanz/6455508 to your computer and use it in GitHub Desktop.
Symmetric Crypto
This file contains 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 SymmetricExtensions | |
{ | |
private const ushort _iteration = 1000; | |
private const int _saltSize = 8; | |
public static byte[] Encrypt(this byte[] plainTextData, string password) | |
{ | |
byte[] encryptedData = null; | |
using (var provider = new RijndaelManaged()) | |
{ | |
provider.Mode = CipherMode.CBC; | |
provider.Padding = PaddingMode.PKCS7; | |
provider.GenerateIV(); | |
var derivedKey = new Rfc2898DeriveBytes(password, _saltSize, _iteration); | |
provider.Key = derivedKey.GetBytes(provider.KeySize >> 3); | |
using (var memStream = new MemoryStream(plainTextData.Length)) | |
{ | |
memStream.Write(provider.IV, 0, 16); | |
memStream.Write(derivedKey.Salt, 0, 8); | |
using (var encryptor = provider.CreateEncryptor(provider.Key, provider.IV)) | |
{ | |
using (var cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write)) | |
{ | |
cryptoStream.Write(plainTextData, 0, plainTextData.Length); | |
cryptoStream.FlushFinalBlock(); | |
} | |
} | |
encryptedData = memStream.ToArray(); | |
} | |
} | |
return encryptedData; | |
} | |
public static string Encrypt(this string plainText, string key) | |
{ | |
var plainTextData = Encoding.UTF8.GetBytes(plainText); | |
var cipherData = plainTextData.Encrypt(key); | |
return Convert.ToBase64String(cipherData); | |
} | |
public static string Decrypt(this string cipherText, string key) | |
{ | |
var cipherData = Convert.FromBase64String(cipherText); | |
var plainTextData = cipherData.Decrypt(key); | |
return Encoding.UTF8.GetString(plainTextData); | |
} | |
public static string Nice(this byte[] data) | |
{ | |
return data.Aggregate("", (current, b) => current + " " + b.ToString()); | |
} | |
public static byte[] Decrypt(this byte[] cipherData, string password) | |
{ | |
var decryptedData = new byte[cipherData.Length]; | |
using (var provider = new RijndaelManaged()) | |
{ | |
provider.Mode = CipherMode.CBC; | |
provider.Padding = PaddingMode.PKCS7; | |
using (var memStream = new MemoryStream(cipherData)) | |
{ | |
var iv = new byte[16]; | |
memStream.Read(iv, 0, 16); | |
var salt = new byte[8]; | |
memStream.Read(salt, 0, 8); | |
var derivedKey = new Rfc2898DeriveBytes(password, salt); | |
provider.Key = derivedKey.GetBytes(provider.KeySize >> 3); | |
int byteCount = 0; | |
using (var decryptor = provider.CreateDecryptor(provider.Key, iv)) | |
{ | |
using (var cryptoStream = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read)) | |
{ | |
byteCount = cryptoStream.Read(decryptedData, 0, decryptedData.Length); | |
} | |
} | |
Array.Resize(ref decryptedData, byteCount); | |
} | |
} | |
return decryptedData; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment