WingMan – Diff between revs 34 and 36

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
Rev 34 Rev 36
Line 1... Line 1...
1 using System.IO; 1 using System.IO;
2 using System.Linq; 2 using System.Linq;
3 using System.Security.Cryptography; 3 using System.Security.Cryptography;
4 using System.Text; -  
5 using System.Threading.Tasks; 4 using System.Threading.Tasks;
Line 6... Line 5...
6   5  
7 namespace WingMan.Utilities 6 namespace WingMan.Utilities
8 { 7 {
9 public static class AES 8 public static class Aes
-   9 {
10 { 10 private const int AesKeySize = 256;
11 private const int AesKeyIterations = 4096; 11 private const int AesKeyIterations = 4096;
12 private const int AesBlockSize = 128; 12 private const int AesBlockSize = 128;
13 private const CipherMode AesCipherMode = CipherMode.CBC; 13 private const CipherMode AesCipherMode = CipherMode.CBC;
14 private const PaddingMode AesPaddingMode = PaddingMode.PKCS7; 14 private const PaddingMode AesPaddingMode = PaddingMode.PKCS7;
Line 26... Line 26...
26 /// <returns>an encrypted stream containing the salt and the data</returns> 26 /// <returns>an encrypted stream containing the salt and the data</returns>
27 public static async Task<MemoryStream> Encrypt(Stream inputStream, string key) 27 public static async Task<MemoryStream> Encrypt(Stream inputStream, string key)
28 { 28 {
29 var outputStream = new MemoryStream(); 29 var outputStream = new MemoryStream();
Line 30... Line 30...
30   30  
31 using (var rijdanelManaged = new RijndaelManaged()) 31 using (var aesManaged = new AesManaged())
32 { 32 {
33 // FIPS-197 / CBC 33 // FIPS-197 / CBC
34 rijdanelManaged.BlockSize = AesBlockSize; 34 aesManaged.BlockSize = AesBlockSize;
35 rijdanelManaged.Mode = AesCipherMode; 35 aesManaged.Mode = AesCipherMode;
-   36 aesManaged.Padding = AesPaddingMode;
Line 36... Line 37...
36 rijdanelManaged.Padding = AesPaddingMode; 37 aesManaged.KeySize = AesKeySize;
37   38  
38 // Compute the salt and the IV from the key. 39 // Compute the salt and the IV from the key.
39 var salt = new byte[AesKeySaltBytes]; 40 var salt = new byte[AesKeySaltBytes];
40 Rng.GetBytes(salt); 41 Rng.GetBytes(salt);
41 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations); 42 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations);
Line 42... Line 43...
42 rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8); 43 aesManaged.Key = derivedKey.GetBytes(aesManaged.KeySize / 8);
43 rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8); 44 aesManaged.IV = derivedKey.GetBytes(aesManaged.BlockSize / 8);
44   45  
45 using (var encryptor = rijdanelManaged.CreateEncryptor(rijdanelManaged.Key, rijdanelManaged.IV)) 46 using (var encryptor = aesManaged.CreateEncryptor(aesManaged.Key, aesManaged.IV))
46 { 47 {
47 using (var memoryStream = new MemoryStream()) 48 using (var memoryStream = new MemoryStream())
Line 74... Line 75...
74 /// <param name="data">the byte array to encrypt</param> 75 /// <param name="data">the byte array to encrypt</param>
75 /// <param name="key">the encryption key</param> 76 /// <param name="key">the encryption key</param>
76 /// <returns>an encrypted byte array</returns> 77 /// <returns>an encrypted byte array</returns>
77 public static async Task<byte[]> Encrypt(byte[] data, string key) 78 public static async Task<byte[]> Encrypt(byte[] data, string key)
78 { 79 {
79 using (var rijdanelManaged = new RijndaelManaged()) 80 using (var aesManaged = new AesManaged())
80 { 81 {
81 // FIPS-197 / CBC 82 // FIPS-197 / CBC
82 rijdanelManaged.BlockSize = AesBlockSize; 83 aesManaged.BlockSize = AesBlockSize;
83 rijdanelManaged.Mode = AesCipherMode; 84 aesManaged.Mode = AesCipherMode;
84 rijdanelManaged.Padding = AesPaddingMode; 85 aesManaged.Padding = AesPaddingMode;
-   86 aesManaged.KeySize = AesKeySize;
Line 85... Line 87...
85   87  
86 // Compute the salt and the IV from the key. 88 // Compute the salt and the IV from the key.
87 var salt = new byte[AesKeySaltBytes]; 89 var salt = new byte[AesKeySaltBytes];
88 Rng.GetBytes(salt); 90 Rng.GetBytes(salt);
89 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations); 91 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations);
90 rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8); 92 aesManaged.Key = derivedKey.GetBytes(aesManaged.KeySize / 8);
Line 91... Line 93...
91 rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8); 93 aesManaged.IV = derivedKey.GetBytes(aesManaged.BlockSize / 8);
92   94  
93 using (var encryptor = rijdanelManaged.CreateEncryptor(rijdanelManaged.Key, rijdanelManaged.IV)) 95 using (var encryptor = aesManaged.CreateEncryptor(aesManaged.Key, aesManaged.IV))
94 { 96 {
95 using (var memoryStream = new MemoryStream()) 97 using (var memoryStream = new MemoryStream())
96 { 98 {
Line 131... Line 133...
131 await inputStream.ReadAsync(text, 0, (int) (inputStream.Length - AesKeySaltBytes)); 133 await inputStream.ReadAsync(text, 0, (int) (inputStream.Length - AesKeySaltBytes));
Line 132... Line 134...
132   134  
133 //var salt = data.Take(AesKeySaltBytes).ToArray(); 135 //var salt = data.Take(AesKeySaltBytes).ToArray();
Line 134... Line 136...
134 //var text = data.Skip(AesKeySaltBytes).ToArray(); 136 //var text = data.Skip(AesKeySaltBytes).ToArray();
135   137  
136 using (var rijdanelManaged = new RijndaelManaged()) 138 using (var aesManaged = new AesManaged())
137 { 139 {
138 // FIPS-197 / CBC 140 // FIPS-197 / CBC
139 rijdanelManaged.BlockSize = AesBlockSize; 141 aesManaged.BlockSize = AesBlockSize;
-   142 aesManaged.Mode = AesCipherMode;
Line 140... Line 143...
140 rijdanelManaged.Mode = AesCipherMode; 143 aesManaged.Padding = AesPaddingMode;
141 rijdanelManaged.Padding = AesPaddingMode; 144 aesManaged.KeySize = AesKeySize;
142   145  
143 // Retrieve the key and the IV from the salt. 146 // Retrieve the key and the IV from the salt.
Line 144... Line 147...
144 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations); 147 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations);
145 rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8); 148 aesManaged.Key = derivedKey.GetBytes(aesManaged.KeySize / 8);
146 rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8); 149 aesManaged.IV = derivedKey.GetBytes(aesManaged.BlockSize / 8);
147   150  
148 using (var decryptor = rijdanelManaged.CreateDecryptor(rijdanelManaged.Key, rijdanelManaged.IV)) 151 using (var decryptor = aesManaged.CreateDecryptor(aesManaged.Key, aesManaged.IV))
149 { 152 {
Line 174... Line 177...
174 public static async Task<byte[]> Decrypt(byte[] data, string key) 177 public static async Task<byte[]> Decrypt(byte[] data, string key)
175 { 178 {
176 var salt = data.Take(AesKeySaltBytes).ToArray(); 179 var salt = data.Take(AesKeySaltBytes).ToArray();
177 var text = data.Skip(AesKeySaltBytes).ToArray(); 180 var text = data.Skip(AesKeySaltBytes).ToArray();
Line 178... Line 181...
178   181  
179 using (var rijdanelManaged = new RijndaelManaged()) 182 using (var aesManaged = new AesManaged())
180 { 183 {
181 // FIPS-197 / CBC 184 // FIPS-197 / CBC
182 rijdanelManaged.BlockSize = AesBlockSize; 185 aesManaged.BlockSize = AesBlockSize;
183 rijdanelManaged.Mode = AesCipherMode; 186 aesManaged.Mode = AesCipherMode;
-   187 aesManaged.Padding = AesPaddingMode;
Line 184... Line 188...
184 rijdanelManaged.Padding = AesPaddingMode; 188 aesManaged.KeySize = AesKeySize;
185   189  
186 // Retrieve the key and the IV from the salt. 190 // Retrieve the key and the IV from the salt.
187 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations); 191 var derivedKey = new Rfc2898DeriveBytes(key, salt, AesKeyIterations);
Line 188... Line 192...
188 rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8); 192 aesManaged.Key = derivedKey.GetBytes(aesManaged.KeySize / 8);
189 rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8); 193 aesManaged.IV = derivedKey.GetBytes(aesManaged.BlockSize / 8);
190   194  
191 using (var decryptor = rijdanelManaged.CreateDecryptor(rijdanelManaged.Key, rijdanelManaged.IV)) 195 using (var decryptor = aesManaged.CreateDecryptor(aesManaged.Key, aesManaged.IV))
192 { 196 {
193 using (var memoryStream = new MemoryStream(text)) 197 using (var memoryStream = new MemoryStream(text))
Line 206... Line 210...
206 } 210 }
207 } 211 }
208 } 212 }
209 } 213 }
Line 210... Line 214...
210   214  
211 public static string ExpandKey(string password, int size = 32) 215 public static string ExpandKey(string password, int length = 32)
212 { 216 {
213 var sb = new StringBuilder(password); -  
214 do -  
215 { 217 if (length <= password.Length) return password.Substring(0, length);
216 sb.Append(password); 218 while (password.Length * 2 <= length) password += password;
217 } while (sb.Length < size); -  
218   219 if (password.Length < length) password += password.Substring(0, length - password.Length);
219 return sb.ToString(0, size); 220 return password;
220 } 221 }
221 } 222 }