59 lines
2.8 KiB
C#
59 lines
2.8 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.IO;
|
|
using System.Security.Cryptography;
|
|
|
|
namespace MadMilkman.Ini
|
|
{
|
|
internal static class IniEncryptor
|
|
{
|
|
/* REMARKS: RijndaelManaged
|
|
* - KeySize - BlockSize
|
|
* DEFAULT = 256 DEFAULT = 128
|
|
* MIN = 128 MIN = 128
|
|
* MAX = 256 MAX = 256
|
|
*
|
|
* - InitializationVector.Length
|
|
* MUST = RijndaelManaged.BlockSize / 8
|
|
*
|
|
* - key.Length
|
|
* MUST = RijndaelManaged.KeySize / 8 */
|
|
|
|
private static readonly byte[] InitializationVector = { 77, 52, 225, 184, 143, 77, 49, 225, 184, 187, 107, 77, 52, 225, 185, 137 };
|
|
private static readonly byte[] Salt = { 49, 110, 49, 102, 49, 108, 51, 39, 53, 95, 53, 52, 108, 55, 95, 118, 52, 108, 117, 51 };
|
|
|
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope",
|
|
Justification = "MemoryStream doesn't have unmanaged resources.")]
|
|
public static string Encrypt(string text, string passwordPhrase, Encoding encoding)
|
|
{
|
|
byte[] content = encoding.GetBytes(text);
|
|
byte[] key = new Rfc2898DeriveBytes(passwordPhrase, IniEncryptor.Salt, 1000).GetBytes(32);
|
|
var stream = new MemoryStream();
|
|
|
|
using (var rijndaelAlgorithm = new RijndaelManaged())
|
|
using (var encryptor = rijndaelAlgorithm.CreateEncryptor(key, IniEncryptor.InitializationVector))
|
|
using (var cryptoStream = new CryptoStream(stream, encryptor, CryptoStreamMode.Write))
|
|
cryptoStream.Write(content, 0, content.Length);
|
|
|
|
return Convert.ToBase64String(stream.ToArray());
|
|
}
|
|
|
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope",
|
|
Justification = "MemoryStream doesn't have unmanaged resources.")]
|
|
public static string Decrypt(string text, string passwordPhrase, Encoding encoding)
|
|
{
|
|
byte[] encryptedContent = Convert.FromBase64String(text);
|
|
byte[] key = new Rfc2898DeriveBytes(passwordPhrase, IniEncryptor.Salt, 1000).GetBytes(32);
|
|
byte[] content = new byte[encryptedContent.Length];
|
|
int contentCount;
|
|
|
|
using (var rijndaelAlgorithm = new RijndaelManaged())
|
|
using (var decryptor = rijndaelAlgorithm.CreateDecryptor(key, IniEncryptor.InitializationVector))
|
|
using (var cryptoStream = new CryptoStream(new MemoryStream(encryptedContent), decryptor, CryptoStreamMode.Read))
|
|
contentCount = cryptoStream.Read(content, 0, content.Length);
|
|
|
|
return encoding.GetString(content, 0, contentCount);
|
|
}
|
|
}
|
|
}
|