using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; using System.Security; namespace DBToolControls { public sealed class EncryptionHelper { private EncryptionHelper() { } private static UnicodeEncoding byteConverter = new UnicodeEncoding(); public static string EncryptString(string key, string stringToEncrypt) { if (key.Length == 0) return stringToEncrypt; byte[] dataToEncrypt = byteConverter.GetBytes(stringToEncrypt); return ByteArrayToHexString(AESEncrypt(dataToEncrypt, CreateCryptoProvider(key))); } public static string DecryptString(string key, string encryptedData) { if (key.Length == 0) return encryptedData; byte[] decryptedData = AESDecrypt(HexStringToByteArray(encryptedData), CreateCryptoProvider(key)); return byteConverter.GetString(decryptedData); } public static SecureString DecryptStringAsSecureString(string key, string encryptedData) { SecureString secStr = new SecureString(); if (key.Length == 0) { foreach(char c in encryptedData) secStr.AppendChar(c); } else { byte[] decryptedData = AESDecrypt(HexStringToByteArray(encryptedData), CreateCryptoProvider(key)); foreach (char c in byteConverter.GetString(decryptedData).ToCharArray()) secStr.AppendChar(c); } return secStr; } private static AesCryptoServiceProvider CreateCryptoProvider(String key) { byte[] salt = {185, 209, 196, 142, 52, 143, 231, 113, 250, 70, 74, 119, 161, 120, 251, 7, 220, 254, 173, 80, 209, 217, 253, 8, 179, 134, 239, 176, 139, 20, 47, 116, 76, 253, 164, 195, 7, 97, 87, 245, 129, 183, 30, 70, 232, 203, 86, 117}; List keyAsByteList = new List(byteConverter.GetBytes(key.ToCharArray())).FindAll(b => b != 0); byte[] sBytes = new byte[48]; for(int i=0; i<48; i++) { sBytes[i] = keyAsByteList[i % keyAsByteList.Count]; } byte[] returnIV = new byte[16]; for (int i = 0; i < 16; i++) { returnIV[i] = (byte)(salt[i] ^ sBytes[i]); } byte[] returnKey = new byte[32]; for (int i = 16; i < 48; i++) { returnKey[i-16] = (byte)(salt[i] ^ sBytes[i]); } AesCryptoServiceProvider returnValue = new AesCryptoServiceProvider(); returnValue.IV = returnIV; returnValue.Key = returnKey; return returnValue; } private static byte[] AESEncrypt(byte[] DataToEncrypt, AesCryptoServiceProvider aes) { return aes.CreateEncryptor().TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length); } private static byte[] AESDecrypt(byte[] DataToDecrypt, AesCryptoServiceProvider aes) { return aes.CreateDecryptor().TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); } private static string ByteArrayToHexString(byte[] data) { StringBuilder sb = new StringBuilder(); foreach (byte b in data) sb.Append(String.Format("{0:X2}", b)); return sb.ToString(); } private static byte[] HexStringToByteArray(string data) { if (data.Length % 2 == 1) throw new CryptographicException("Invalid data"); byte[] bytes = new byte[data.Length / 2]; for (int i = 0; i < data.Length; i += 2) bytes[i/2] = Byte.Parse(data.Substring(i, 2), System.Globalization.NumberStyles.HexNumber); return bytes; } } }