using System; using System.Security.Cryptography; using System.Text; namespace HackForums.gigajew { /// /// Created by gigajew@hf /// public sealed class MultiCrypt { public string Key { get { return Convert.ToBase64String(_key); } set { _key = Convert.FromBase64String(value); } } public string IV { get { return Convert.ToBase64String(_iv); } set { _iv = Convert.FromBase64String(value); } } public void GenerateKey(MultiCryptType type) { SymmetricAlgorithm symmetricAlgorithm; using (symmetricAlgorithm = FromMultiCryptType(type)) { symmetricAlgorithm.GenerateKey(); _key = symmetricAlgorithm.Key; } } public void GenerateIV(MultiCryptType type) { SymmetricAlgorithm symmetricAlgorithm; using (symmetricAlgorithm = FromMultiCryptType(type)) { symmetricAlgorithm.GenerateIV(); _iv = symmetricAlgorithm.IV; } } public byte[] Encrypt(MultiCryptType type, byte[] data) { if (_key == null) GenerateKey(type); if (_iv == null) GenerateIV(type); SymmetricAlgorithm symmetricAlgorithm; using (symmetricAlgorithm = FromMultiCryptType(type)) { symmetricAlgorithm.Key = _key; symmetricAlgorithm.IV = _iv; using (ICryptoTransform transformer = symmetricAlgorithm.CreateEncryptor()) { return transformer.TransformFinalBlock(data, 0, data.Length); } } } public string Encrypt(MultiCryptType type, string data) { return Convert.ToBase64String(Encrypt(type, Encoding.UTF8.GetBytes(data))); } public byte[] Decrypt(MultiCryptType type, byte[] data) { if (_key == null) GenerateKey(type); if (_iv == null) GenerateIV(type); SymmetricAlgorithm symmetricAlgorithm; using (symmetricAlgorithm = FromMultiCryptType(type)) { symmetricAlgorithm.Key = _key; symmetricAlgorithm.IV = _iv; using (ICryptoTransform transformer = symmetricAlgorithm.CreateDecryptor()) { return transformer.TransformFinalBlock(data, 0, data.Length); } } } public string Decrypt(MultiCryptType type, string data) { return Encoding.UTF8.GetString(Decrypt(type, Convert.FromBase64String(data))); } private SymmetricAlgorithm FromMultiCryptType(MultiCryptType type) { switch (type) { case MultiCryptType.Rijndael: return RijndaelManaged.Create(); case MultiCryptType.TripleDES: return TripleDES.Create(); case MultiCryptType.DES: return DES.Create(); case MultiCryptType.RC2: return RC2.Create(); default: return RijndaelManaged.Create(); } } private byte[] _key; private byte[] _iv; } public enum MultiCryptType { Rijndael, TripleDES, DES, RC2 } }