Project_Keywi/Project.Persistence/Crypto.cs

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