moved from SVN to git
This commit is contained in:
91
DBToolControls/EncryptionHelper.cs
Normal file
91
DBToolControls/EncryptionHelper.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
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<byte> keyAsByteList = new List<byte>(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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user