TPS1100-Convert/MadMilkman.Ini-1.0.6/MadMilkman.Ini/IniReaderWriter/IniEncryptor.cs
2024-06-02 05:35:03 +02:00

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);
}
}
}