240 lines
7.7 KiB
C#
240 lines
7.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace SetAlertTemplate
|
|
{
|
|
public class SymCryptography
|
|
{
|
|
private string mKey = string.Empty;
|
|
private string mSalt = string.Empty;
|
|
private byte[] mPasswordDeriveBytesKey = new byte[0];
|
|
private ServiceProviderEnum mAlgorithm;
|
|
private SymmetricAlgorithm mCryptoService;
|
|
|
|
private void SetLegalIV()
|
|
{
|
|
// Set symmetric algorithm
|
|
switch (mAlgorithm)
|
|
{
|
|
case ServiceProviderEnum.Rijndael:
|
|
mCryptoService.IV = new byte[] { 0xf, 0x6f, 0x13, 0x2e, 0x35, 0xc2, 0xcd, 0xf9, 0x5, 0x46, 0x9c, 0xea, 0xa8, 0x4b, 0x73, 0xcc };
|
|
break;
|
|
default:
|
|
mCryptoService.IV = new byte[] { 0xf, 0x6f, 0x13, 0x2e, 0x35, 0xc2, 0xcd, 0xf9 };
|
|
break;
|
|
}
|
|
}
|
|
|
|
public enum ServiceProviderEnum : int
|
|
{
|
|
// Supported service providers
|
|
Rijndael,
|
|
RC2,
|
|
DES,
|
|
TripleDES
|
|
}
|
|
|
|
public SymCryptography()
|
|
{
|
|
// Default symmetric algorithm
|
|
mCryptoService = new RijndaelManaged();
|
|
mCryptoService.Mode = CipherMode.CBC;
|
|
mAlgorithm = ServiceProviderEnum.Rijndael;
|
|
}
|
|
|
|
public SymCryptography(ServiceProviderEnum serviceProvider)
|
|
{
|
|
// Select symmetric algorithm
|
|
switch (serviceProvider)
|
|
{
|
|
case ServiceProviderEnum.Rijndael:
|
|
mCryptoService = new RijndaelManaged();
|
|
mAlgorithm = ServiceProviderEnum.Rijndael;
|
|
break;
|
|
case ServiceProviderEnum.RC2:
|
|
mCryptoService = new RC2CryptoServiceProvider();
|
|
mAlgorithm = ServiceProviderEnum.RC2;
|
|
break;
|
|
case ServiceProviderEnum.DES:
|
|
mCryptoService = new DESCryptoServiceProvider();
|
|
mAlgorithm = ServiceProviderEnum.DES;
|
|
break;
|
|
case ServiceProviderEnum.TripleDES:
|
|
mCryptoService = new TripleDESCryptoServiceProvider();
|
|
mAlgorithm = ServiceProviderEnum.TripleDES;
|
|
break;
|
|
}
|
|
mCryptoService.Mode = CipherMode.CBC;
|
|
}
|
|
|
|
public SymCryptography(string serviceProviderName)
|
|
{
|
|
try
|
|
{
|
|
// Select symmetric algorithm
|
|
switch (serviceProviderName.ToLower())
|
|
{
|
|
case "rijndael":
|
|
serviceProviderName = "Rijndael";
|
|
mAlgorithm = ServiceProviderEnum.Rijndael;
|
|
break;
|
|
case "rc2":
|
|
serviceProviderName = "RC2";
|
|
mAlgorithm = ServiceProviderEnum.RC2;
|
|
break;
|
|
case "des":
|
|
serviceProviderName = "DES";
|
|
mAlgorithm = ServiceProviderEnum.DES;
|
|
break;
|
|
case "tripledes":
|
|
serviceProviderName = "TripleDES";
|
|
mAlgorithm = ServiceProviderEnum.TripleDES;
|
|
break;
|
|
}
|
|
|
|
// Set symmetric algorithm
|
|
mCryptoService = (SymmetricAlgorithm)
|
|
CryptoConfig.CreateFromName(serviceProviderName);
|
|
mCryptoService.Mode = CipherMode.CBC;
|
|
}
|
|
catch
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
|
|
public virtual byte[] GetLegalKey()
|
|
{
|
|
// Adjust key if necessary, and return a valid key
|
|
if (mCryptoService.LegalKeySizes.Length > 0)
|
|
{
|
|
// Key sizes in bits
|
|
int keySize = mKey.Length * 8;
|
|
int minSize = mCryptoService.LegalKeySizes[0].MinSize;
|
|
int maxSize = mCryptoService.LegalKeySizes[0].MaxSize;
|
|
int skipSize = mCryptoService.LegalKeySizes[0].SkipSize;
|
|
|
|
if (keySize > maxSize)
|
|
{
|
|
// Extract maximum size allowed
|
|
mKey = mKey.Substring(0, maxSize / 8);
|
|
}
|
|
else if (keySize < maxSize)
|
|
{
|
|
// Set valid size
|
|
int validSize = (keySize <= minSize) ? minSize :
|
|
(keySize - keySize % skipSize) + skipSize;
|
|
if (keySize < validSize)
|
|
{
|
|
// Pad the key with asterisk to make up the size
|
|
mKey = mKey.PadRight(validSize / 8, '*');
|
|
}
|
|
}
|
|
}
|
|
PasswordDeriveBytes key = new PasswordDeriveBytes(mKey, ASCIIEncoding.ASCII.GetBytes(mSalt));
|
|
this.mPasswordDeriveBytesKey = key.GetBytes(mKey.Length);
|
|
return mPasswordDeriveBytesKey;
|
|
}
|
|
|
|
public virtual byte[] Encrypt(byte[] plainByte)
|
|
{
|
|
//byte[] plainByte = ASCIIEncoding.ASCII.GetBytes(plainText);
|
|
byte[] keyByte = GetLegalKey();
|
|
|
|
// Set private key
|
|
mCryptoService.Key = keyByte;
|
|
SetLegalIV();
|
|
|
|
// Encryptor object
|
|
ICryptoTransform cryptoTransform = mCryptoService.CreateEncryptor();
|
|
|
|
// Memory stream object
|
|
MemoryStream ms = new MemoryStream();
|
|
|
|
// Crpto stream object
|
|
CryptoStream cs = new CryptoStream(ms, cryptoTransform,
|
|
CryptoStreamMode.Write);
|
|
|
|
// Write encrypted byte to memory stream
|
|
cs.Write(plainByte, 0, plainByte.Length);
|
|
cs.FlushFinalBlock();
|
|
|
|
// Get the encrypted byte length
|
|
byte[] cryptoByte = ms.ToArray();
|
|
|
|
//// Convert into base 64 to enable result to be used in Xml
|
|
//return Convert.ToBase64String(cryptoByte, 0, cryptoByte.GetLength(0));
|
|
return cryptoByte;
|
|
}
|
|
|
|
public virtual string Decrypt(byte[] cryptoByte)
|
|
{
|
|
//// Convert from base 64 string to bytes
|
|
//byte[] cryptoByte = Convert.FromBase64String(cryptoText);
|
|
byte[] keyByte = GetLegalKey();
|
|
|
|
// Set private key
|
|
mCryptoService.Key = keyByte;
|
|
SetLegalIV();
|
|
|
|
// Decryptor object
|
|
ICryptoTransform cryptoTransform = mCryptoService.CreateDecryptor();
|
|
try
|
|
{
|
|
// Memory stream object
|
|
MemoryStream ms = new MemoryStream(cryptoByte, 0, cryptoByte.Length);
|
|
|
|
// Crpto stream object
|
|
CryptoStream cs = new CryptoStream(ms, cryptoTransform,
|
|
CryptoStreamMode.Read);
|
|
|
|
// Get the result from the Crypto stream
|
|
StreamReader sr = new StreamReader(cs);
|
|
return sr.ReadToEnd();
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public byte[] PasswordDeriveBytesKey
|
|
{
|
|
get
|
|
{
|
|
return this.mPasswordDeriveBytesKey;
|
|
}
|
|
}
|
|
|
|
public string Key
|
|
{
|
|
get
|
|
{
|
|
return mKey;
|
|
}
|
|
set
|
|
{
|
|
mKey = value;
|
|
}
|
|
}
|
|
|
|
public string Salt
|
|
{
|
|
// Salt value
|
|
get
|
|
{
|
|
return mSalt;
|
|
}
|
|
set
|
|
{
|
|
mSalt = value;
|
|
}
|
|
}
|
|
}
|
|
}
|