using System;
using System.Security.Cryptography;
using System.Text;
namespace HackForums.gigajew
{
/// <summary>
/// Created by gigajew@hf
/// </summary>
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
}
}