Winify – Diff between revs 28 and 41
?pathlinks?
Rev 28 | Rev 41 | |||
---|---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////// |
1 | /////////////////////////////////////////////////////////////////////////// |
|
2 | // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 // |
2 | // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 // |
|
3 | // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // |
3 | // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // |
|
4 | // rights of fair usage, the disclaimer and warranty conditions. // |
4 | // rights of fair usage, the disclaimer and warranty conditions. // |
|
5 | /////////////////////////////////////////////////////////////////////////// |
5 | /////////////////////////////////////////////////////////////////////////// |
|
6 | |
6 | |
|
7 | using System.IO; |
7 | using System.IO; |
|
8 | using System.Linq; |
8 | using System.Linq; |
|
9 | using System.Security.Cryptography; |
9 | using System.Security.Cryptography; |
|
- | 10 | using System.Threading.Tasks; |
||
10 | |
11 | |
|
11 | namespace Winify.Utilities |
12 | namespace Winify.Utilities |
|
12 | { |
13 | { |
|
13 | public static class AES |
14 | public static class AES |
|
14 | { |
15 | { |
|
15 | #region Static Fields and Constants |
16 | #region Static Fields and Constants |
|
16 | |
17 | |
|
17 | private const int AESKeySaltBytes = 16; |
18 | private const int AESKeySaltBytes = 16; |
|
18 | |
19 | |
|
19 | private static readonly RNGCryptoServiceProvider Rng = new RNGCryptoServiceProvider(); |
20 | private static readonly RNGCryptoServiceProvider Rng = new RNGCryptoServiceProvider(); |
|
20 | |
21 | |
|
21 | #endregion |
22 | #endregion |
|
22 | |
23 | |
|
23 | #region Public Methods |
24 | #region Public Methods |
|
24 | |
25 | |
|
25 | /////////////////////////////////////////////////////////////////////////// |
26 | /////////////////////////////////////////////////////////////////////////// |
|
26 | // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 // |
27 | // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 // |
|
27 | /////////////////////////////////////////////////////////////////////////// |
28 | /////////////////////////////////////////////////////////////////////////// |
|
28 | public static byte[] Encrypt(byte[] plain, string password) |
29 | public static async Task<byte[]> Encrypt(byte[] plain, string password) |
|
29 | { |
30 | { |
|
30 | using (var rijndael = Rijndael.Create()) |
31 | using (var rijndael = Rijndael.Create()) |
|
31 | { |
32 | { |
|
32 | rijndael.BlockSize = 128; |
33 | rijndael.BlockSize = 128; |
|
33 | rijndael.Mode = CipherMode.CBC; |
34 | rijndael.Mode = CipherMode.CBC; |
|
34 | rijndael.KeySize = 256; |
35 | rijndael.KeySize = 256; |
|
35 | rijndael.Padding = PaddingMode.PKCS7; |
36 | rijndael.Padding = PaddingMode.PKCS7; |
|
36 | var salt = new byte[AESKeySaltBytes]; |
37 | var salt = new byte[AESKeySaltBytes]; |
|
37 | Rng.GetBytes(salt); |
38 | Rng.GetBytes(salt); |
|
38 | var pdb = new Rfc2898DeriveBytes(password, salt, 1000); |
39 | using (var pdb = new Rfc2898DeriveBytes(password, salt, 1000)) |
|
39 | rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8); |
- | ||
40 | rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8); |
- | ||
41 | |
- | ||
42 | using (var memoryStream = new MemoryStream()) |
- | ||
43 | { |
40 | { |
|
44 | using (var cryptoStream = |
41 | rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8); |
|
- | 42 | rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8); |
||
- | 43 | |
||
45 | new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write)) |
44 | using (var memoryStream = new MemoryStream()) |
|
46 | { |
45 | { |
|
- | 46 | using (var cryptoStream = |
||
- | 47 | new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write)) |
||
- | 48 | { |
||
47 | cryptoStream.Write(plain, 0, plain.Length); |
49 | await cryptoStream.WriteAsync(plain, 0, plain.Length); |
|
48 | cryptoStream.Close(); |
50 | cryptoStream.Close(); |
|
49 | |
51 | |
|
50 | var ciphertext = memoryStream.ToArray(); |
52 | var ciphertext = memoryStream.ToArray(); |
|
51 | |
53 | |
|
52 | return salt.Concat(ciphertext) |
54 | return salt.Concat(ciphertext).ToArray(); |
|
53 | .ToArray(); |
55 | } |
|
54 | } |
56 | } |
|
55 | } |
57 | } |
|
56 | } |
58 | } |
|
57 | } |
59 | } |
|
58 | |
60 | |
|
59 | /////////////////////////////////////////////////////////////////////////// |
61 | /////////////////////////////////////////////////////////////////////////// |
|
60 | // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 // |
62 | // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 // |
|
61 | /////////////////////////////////////////////////////////////////////////// |
63 | /////////////////////////////////////////////////////////////////////////// |
|
62 | public static byte[] Decrypt(byte[] cipher, string password) |
64 | public static async Task<byte[]> Decrypt(byte[] cipher, string password) |
|
63 | { |
65 | { |
|
64 | using (var rijndael = Rijndael.Create()) |
66 | using (var rijndael = Rijndael.Create()) |
|
65 | { |
67 | { |
|
66 | rijndael.BlockSize = 128; |
68 | rijndael.BlockSize = 128; |
|
67 | rijndael.Mode = CipherMode.CBC; |
69 | rijndael.Mode = CipherMode.CBC; |
|
68 | rijndael.KeySize = 256; |
70 | rijndael.KeySize = 256; |
|
69 | rijndael.Padding = PaddingMode.PKCS7; |
71 | rijndael.Padding = PaddingMode.PKCS7; |
|
70 | |
72 | |
|
71 | var salt = cipher.Take(16) |
- | ||
72 | .ToArray(); |
73 | var salt = cipher.Take(AESKeySaltBytes).ToArray(); |
|
73 | |
- | ||
74 | var ciphertext = cipher.Skip(16) |
74 | |
|
75 | .ToArray(); |
- | ||
76 | |
- | ||
77 | var pdb = new Rfc2898DeriveBytes(password, salt, 1000); |
- | ||
78 | rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8); |
- | ||
79 | rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8); |
75 | var ciphertext = cipher.Skip(AESKeySaltBytes).ToArray(); |
|
80 | |
76 | |
|
- | 77 | using (var pdb = new Rfc2898DeriveBytes(password, salt, 1000)) |
||
- | 78 | { |
||
81 | using (var memoryStream = new MemoryStream()) |
79 | rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8); |
|
82 | { |
80 | rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8); |
|
- | 81 | |
||
- | 82 | using (var memoryStream = new MemoryStream()) |
||
- | 83 | { |
||
83 | using (var cryptoStream = |
84 | using (var cryptoStream = |
|
84 | new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write)) |
85 | new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write)) |
|
85 | { |
86 | { |
|
- | 87 | await cryptoStream.WriteAsync(ciphertext, 0, ciphertext.Length); |
||
86 | cryptoStream.Write(ciphertext, 0, ciphertext.Length); |
88 | cryptoStream.Close(); |
|
87 | cryptoStream.Close(); |
89 | |
|
88 | |
90 | return memoryStream.ToArray(); |
|
89 | return memoryStream.ToArray(); |
91 | } |
|
90 | } |
92 | } |
|
91 | } |
93 | } |
|
92 | } |
94 | } |
|
93 | } |
95 | } |
|
94 | |
96 | |
|
95 | #endregion |
97 | #endregion |
|
96 | } |
98 | } |
|
97 | } |
99 | } |
|
98 | |
100 | |
|
99 |
|
101 |
|
|
100 | |
102 | |
|
101 | |
103 | |
|
102 | |
104 | |