reactredux/webapi/CryptoProvider/AesService.cs

78 lines
2.3 KiB
C#

using System.Text;
using System.Security.Cryptography;
namespace CryptoProvider {
public static class AesService {
public static IAesKey GenerateKey() {
using var aes = Aes.Create();
aes.GenerateIV();
aes.GenerateKey();
return new AesKey {
IV = Convert.ToBase64String(aes.IV),
Key = Convert.ToBase64String(aes.Key)
};
}
public static string EncryptString(string key, string plainText) =>
EncryptStringCore(new byte[16], Convert.FromBase64String(key), plainText);
public static string EncryptString(string iv, string key, string plainText) =>
EncryptStringCore(Convert.FromBase64String(iv), Convert.FromBase64String(key), plainText);
public static string DecryptString(string key, string cipherText) =>
DecryptStringCore(new byte[16], Convert.FromBase64String(key), cipherText);
public static string DecryptString(string iv, string key, string cipherText) =>
DecryptStringCore(Convert.FromBase64String(iv), Convert.FromBase64String(key), cipherText);
#region Core methods
private static string EncryptStringCore(byte[] iv, byte[] key, string plainText) {
byte[] array;
using var aes = Aes.Create();
aes.Key = key;
aes.IV = iv;
var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using var memoryStream = new MemoryStream();
using var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
using var streamWriter = new StreamWriter(cryptoStream);
streamWriter.Write(plainText);
streamWriter.Flush();
cryptoStream.FlushFinalBlock();
array = memoryStream.ToArray();
return Convert.ToBase64String(array);
}
private static string DecryptStringCore(byte [] iv, byte [] key, string cipherText) {
byte[] buffer = Convert.FromBase64String(cipherText);
using var aes = Aes.Create();
aes.Key = key;
aes.IV = iv;
var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using var memoryStream = new MemoryStream(buffer);
using var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
using var streamReader = new StreamReader(cryptoStream);
return streamReader.ReadToEnd();
}
#endregion
}
}