Advertisement
Guest User

CRYPTER

a guest
Aug 26th, 2016
990
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.33 KB | None | 0 0
  1. using System;
  2. using System.Text;
  3. using System.Security.Cryptography;
  4. using System.IO;
  5. using System.Linq;
  6.  
  7. namespace EncryptStringSample
  8. {
  9.     public static class StringCipher
  10.     {
  11.         private const int Keysize = 256;
  12.         private const int DerivationIterations = 1000;
  13.  
  14.         public static string Encrypt(string plainText, string passPhrase)
  15.         {
  16.             var saltStringBytes = Generate256BitsOfRandomEntropy();
  17.             var ivStringBytes = Generate256BitsOfRandomEntropy();
  18.             var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
  19.             using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
  20.             {
  21.                 var keyBytes = password.GetBytes(Keysize / 8);
  22.                 using (var symmetricKey = new RijndaelManaged())
  23.                 {
  24.                     symmetricKey.BlockSize = 256;
  25.                     symmetricKey.Mode = CipherMode.CBC;
  26.                     symmetricKey.Padding = PaddingMode.PKCS7;
  27.                     using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes))
  28.                     {
  29.                         using (var memoryStream = new MemoryStream())
  30.                         {
  31.                             using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
  32.                             {
  33.                                 cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
  34.                                 cryptoStream.FlushFinalBlock();
  35.                                 var cipherTextBytes = saltStringBytes;
  36.                                 cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray();
  37.                                 cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray();
  38.                                 memoryStream.Close();
  39.                                 cryptoStream.Close();
  40.                                 return Convert.ToBase64String(cipherTextBytes);
  41.                             }
  42.                         }
  43.                     }
  44.                 }
  45.             }
  46.         }
  47.  
  48.         public static string Decrypt(string cipherText, string passPhrase)
  49.         {
  50.             var cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText);
  51.             var saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray();
  52.             var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8).Take(Keysize / 8).ToArray();
  53.             var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((Keysize / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((Keysize / 8) * 2)).ToArray();
  54.  
  55.             using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
  56.             {
  57.                 var keyBytes = password.GetBytes(Keysize / 8);
  58.                 using (var symmetricKey = new RijndaelManaged())
  59.                 {
  60.                     symmetricKey.BlockSize = 256;
  61.                     symmetricKey.Mode = CipherMode.CBC;
  62.                     symmetricKey.Padding = PaddingMode.PKCS7;
  63.                     using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes))
  64.                     {
  65.                         using (var memoryStream = new MemoryStream(cipherTextBytes))
  66.                         {
  67.                             using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
  68.                             {
  69.                                 var plainTextBytes = new byte[cipherTextBytes.Length];
  70.                                 var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
  71.                                 memoryStream.Close();
  72.                                 cryptoStream.Close();
  73.                                 return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
  74.                             }
  75.                         }
  76.                     }
  77.                 }
  78.             }
  79.         }
  80.  
  81.         private static byte[] Generate256BitsOfRandomEntropy()
  82.         {
  83.             var randomBytes = new byte[32]; // 32 Bytes will give us 256 bits.
  84.             using (var rngCsp = new RNGCryptoServiceProvider())
  85.             {
  86.                 rngCsp.GetBytes(randomBytes);
  87.             }
  88.             return randomBytes;
  89.         }
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement