68 lines
2.3 KiB
C#
68 lines
2.3 KiB
C#
using System.Security.Cryptography;
|
|
using System.Text;
|
|
namespace Project.Persistence;
|
|
|
|
public class Crypto
|
|
{
|
|
private static readonly string _key = "myKeyIsSecureAsFuck";
|
|
|
|
public static string EncryptPassword(string password)
|
|
{
|
|
using (Aes aes = Aes.Create())
|
|
{
|
|
byte[] key = DeriveKey(_key);
|
|
aes.Key = key;
|
|
aes.GenerateIV(); // generate new IV
|
|
|
|
ICryptoTransform encryptor = aes.CreateEncryptor();
|
|
|
|
using (MemoryStream msEncrypt = new MemoryStream())
|
|
{
|
|
// save IV
|
|
msEncrypt.Write(aes.IV, 0, aes.IV.Length);
|
|
|
|
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
|
|
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
|
|
{
|
|
swEncrypt.Write(password);
|
|
}
|
|
|
|
return Convert.ToBase64String(msEncrypt.ToArray());
|
|
}
|
|
}
|
|
}
|
|
|
|
public static string DecryptPassword(string encryptedPassword)
|
|
{
|
|
byte[] fullCipher = Convert.FromBase64String(encryptedPassword);
|
|
|
|
using (Aes aes = Aes.Create())
|
|
{
|
|
byte[] key = DeriveKey(_key);
|
|
aes.Key = key;
|
|
|
|
// extract IV from encryption
|
|
byte[] iv = new byte[aes.BlockSize / 8];
|
|
Array.Copy(fullCipher, 0, iv, 0, iv.Length);
|
|
aes.IV = iv;
|
|
|
|
ICryptoTransform decryptor = aes.CreateDecryptor();
|
|
|
|
using (MemoryStream msDecrypt = new MemoryStream(fullCipher, iv.Length, fullCipher.Length - iv.Length))
|
|
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
|
|
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
|
|
{
|
|
return srDecrypt.ReadToEnd();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static byte[] DeriveKey(string key)
|
|
{
|
|
// 256 bits for AES-256
|
|
using (var deriveBytes = new Rfc2898DeriveBytes(key, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }, 1000))
|
|
{
|
|
return deriveBytes.GetBytes(32);
|
|
}
|
|
}
|
|
} |