-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEncryption.cs
More file actions
134 lines (125 loc) · 5.26 KB
/
Encryption.cs
File metadata and controls
134 lines (125 loc) · 5.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Configuration;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Web;
namespace Encryption
{
public static class Encryption
{
private static readonly byte[] Salt = (ConfigurationManager.AppSettings["Salt"] == null ? "ADB928C878FC4D54844926688EBBE1C0".CreateMd5Hash() : ConfigurationManager.AppSettings["Salt"].CreateMd5Hash());
/// <summary>
/// Create a hashed password salted with a user unique identifier
/// </summary>
/// <param name="password">Clear text password to hash</param>
/// <param name="userUniqueIdentifier">User unique identifier</param>
/// <returns>Bytes of hashed password</returns>
public static byte[] CreateMd5PasswordHash(this string password, string userUniqueIdentifier)
{
using (var md5Hash = MD5.Create())
return md5Hash.ComputeHash(Encoding.UTF8.GetBytes(userUniqueIdentifier + password));
}
/// <summary>
/// Create an MD5 hash of a password
/// </summary>
/// <param name="password">Clear text password to hash</param>
/// <returns>Bytes of hashed password</returns>
public static byte[] CreateMd5Hash(this string password)
{
using (var md5Hash = MD5.Create())
return md5Hash.ComputeHash(Encoding.UTF8.GetBytes(password));
}
/// <summary>
/// Encrypt data for a URL
/// </summary>
/// <param name="id">URL data to encrypt</param>
/// <returns>Encrypted string of URL data</returns>
public static string EncryptUrl(this string id)
{
return HttpUtility.UrlEncode(Encrypt(id, "URLEncrypt"));
}
/// <summary>
/// Decrypt data for a URL
/// </summary>
/// <param name="id">URL data to decrypt</param>
/// <returns>Decrypted string of URL data</returns>
public static string DecryptUrl(this string id)
{
return HttpUtility.UrlDecode(Decrypt(id, "URLEncrypt"));
}
/// <summary>
/// Encrypt string data with a password
/// </summary>
/// <param name="clearText">Data to encrypt</param>
/// <param name="password">Password to encrypt with</param>
/// <returns>Encrypted string</returns>
public static string Encrypt(this string clearText, string password)
{
var bytes = Encoding.Unicode.GetBytes(clearText);
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, Salt);
return
Convert.ToBase64String(Encrypt(bytes, rfc2898DeriveBytes.GetBytes(32), rfc2898DeriveBytes.GetBytes(32)));
}
/// <summary>
/// Decrypt string data with a password
/// </summary>
/// <param name="cipherText">Encrypted string data</param>
/// <param name="password">Password to decrypt with</param>
/// <returns>Decrypted string</returns>
public static string Decrypt(this string cipherText, string password)
{
var cipherData = Convert.FromBase64String(cipherText);
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, Salt);
return
Encoding.Unicode.GetString(Decrypt(cipherData, rfc2898DeriveBytes.GetBytes(32),
rfc2898DeriveBytes.GetBytes(32)));
}
private static byte[] Decrypt(byte[] cipherData, byte[] key, byte[] iv)
{
using (var memoryStream = new MemoryStream())
{
using (var rijndael = Rijndael.Create())
{
rijndael.KeySize = 256;
rijndael.BlockSize = 256;
rijndael.Key = key;
rijndael.IV = iv;
rijndael.Mode = CipherMode.CBC;
rijndael.Padding = PaddingMode.PKCS7;
using (
var cryptoStream = new CryptoStream(memoryStream, rijndael.CreateDecryptor(),
CryptoStreamMode.Write))
{
cryptoStream.Write(cipherData, 0, cipherData.Length);
cryptoStream.Close();
return memoryStream.ToArray();
}
}
}
}
private static byte[] Encrypt(byte[] clearData, byte[] key, byte[] iv)
{
using (var memoryStream = new MemoryStream())
{
using (var rijndael = Rijndael.Create())
{
rijndael.KeySize = 256;
rijndael.BlockSize = 256;
rijndael.Key = key;
rijndael.IV = iv;
rijndael.Mode = CipherMode.CBC;
rijndael.Padding = PaddingMode.PKCS7;
using (
var cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(),
CryptoStreamMode.Write))
{
cryptoStream.Write(clearData, 0, clearData.Length);
cryptoStream.Close();
}
return memoryStream.ToArray();
}
}
}
}
}