WingMan

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 9  →  ?path2? @ 10
/trunk/WingMan/Utilities/AES.cs
@@ -2,7 +2,6 @@
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
 
namespace WingMan.Utilities
{
@@ -24,7 +23,7 @@
/// <param name="key">the encryption key</param>
/// <param name="separator">the separator to use between the cyphertext and the IV</param>
/// <returns>Base64 encoded encrypted data</returns>
public static async Task<byte[]> Encrypt(byte[] data, string key, string separator = ":")
public static byte[] Encrypt(byte[] data, string key, string separator = ":")
{
using (var rijdanelManaged = new RijndaelManaged())
{
@@ -36,29 +35,31 @@
// Compute the salt and the IV from the key.
var salt = new byte[AesKeySaltBytes];
Rng.GetBytes(salt);
var derivedKey = new Rfc2898DeriveBytes(key, salt);
rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8);
rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8);
using (var derivedKey = new Rfc2898DeriveBytes(key, salt))
{
rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8);
rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8);
 
using (var encryptor = rijdanelManaged.CreateEncryptor(rijdanelManaged.Key, rijdanelManaged.IV))
{
using (var memoryStream = new MemoryStream())
using (var encryptor = rijdanelManaged.CreateEncryptor(rijdanelManaged.Key, rijdanelManaged.IV))
{
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
using (var memoryStream = new MemoryStream())
{
using (var inputStream = new MemoryStream(data))
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
await inputStream.CopyToAsync(cryptoStream).ConfigureAwait(false);
cryptoStream.FlushFinalBlock();
using (var inputStream = new MemoryStream(data))
{
inputStream.CopyTo(cryptoStream);
cryptoStream.FlushFinalBlock();
 
inputStream.Position = 0L;
inputStream.Position = 0L;
 
var payload = memoryStream.ToArray();
var payload = memoryStream.ToArray();
 
var base64Salt = Convert.ToBase64String(salt);
var base64Payload = Convert.ToBase64String(payload);
var base64Salt = Convert.ToBase64String(salt);
var base64Payload = Convert.ToBase64String(payload);
 
return Encoding.UTF8.GetBytes($"{base64Salt}{separator}{base64Payload}");
return Encoding.UTF8.GetBytes($"{base64Salt}{separator}{base64Payload}");
}
}
}
}
@@ -79,7 +80,7 @@
/// <param name="key">the encryption key</param>
/// <param name="separator">the separator to use between the cyphertext and the IV</param>
/// <returns>the decrypted data</returns>
public static async Task<byte[]> Decrypt(byte[] data, string key, string separator = ":")
public static byte[] Decrypt(byte[] data, string key, string separator = ":")
{
var input = Encoding.UTF8.GetString(data);
 
@@ -86,7 +87,7 @@
// retrieve the salt from the data.
var segments = input.Split(new[] {separator}, StringSplitOptions.None);
if (segments.Length != 2)
throw new ArgumentException("Invalid data.");
throw new ArgumentException("Invalid data: " + input);
 
using (var rijdanelManaged = new RijndaelManaged())
{
@@ -96,20 +97,21 @@
rijdanelManaged.Padding = AesPaddingMode;
 
// Retrieve the key and the IV from the salt.
var derivedKey = new Rfc2898DeriveBytes(key, Convert.FromBase64String(segments[0].Trim()));
rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8);
rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8);
using (var derivedKey = new Rfc2898DeriveBytes(key, Convert.FromBase64String(segments[0].Trim())))
{
rijdanelManaged.Key = derivedKey.GetBytes(rijdanelManaged.KeySize / 8);
rijdanelManaged.IV = derivedKey.GetBytes(rijdanelManaged.BlockSize / 8);
 
using (var decryptor = rijdanelManaged.CreateDecryptor(rijdanelManaged.Key, rijdanelManaged.IV))
{
using (var memoryStream = new MemoryStream(Convert.FromBase64String(segments[1].Trim())))
using (var decryptor = rijdanelManaged.CreateDecryptor(rijdanelManaged.Key, rijdanelManaged.IV))
{
using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
using (var memoryStream = new MemoryStream(Convert.FromBase64String(segments[1].Trim())))
{
using (var streamReader = new StreamReader(cryptoStream))
using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
return Encoding.UTF8.GetBytes(await streamReader.ReadToEndAsync()
.ConfigureAwait(false));
using (var streamReader = new StreamReader(cryptoStream))
{
return Encoding.UTF8.GetBytes(streamReader.ReadToEnd());
}
}
}
}
@@ -117,7 +119,7 @@
}
}
 
public static string LinearFeedbackShiftPassword(string password, int size = 32)
public static string ExpandKey(string password, int size = 32)
{
var sb = new StringBuilder(password);
do