public virtual string Decrypt(string password, AesModel aesModel) { if (string.IsNullOrWhiteSpace(password)) { throw new ArgumentException($"{nameof(password)} has no value", nameof(password)); } var key = new Rfc2898DeriveBytes(password, aesModel.KeyDerivation.Salt, aesModel.KeyDerivation.WorkFactor); var provider = GetAesProvider(); provider.Key = key.GetBytes(provider.KeySize / 8); provider.IV = aesModel.InitializationVector; var cipherText = Convert.FromBase64String(aesModel.Payload); var transform = provider.CreateDecryptor(); var decryptedBytes = transform.TransformFinalBlock(cipherText, 0, cipherText.Length); return(Encoding.UTF8.GetString(decryptedBytes)); }
public virtual string Encrypt(string password, string cleartext) { if (string.IsNullOrWhiteSpace(password)) { throw new ArgumentException($"{nameof(password)} has no value", nameof(password)); } var aesModel = new AesModel { Algorithm = "aes-gcm-256", Version = "1" }; var provider = GetAesProvider(); var keyDer = new KeyDerivation { Salt = GetSalt(), WorkFactor = 12000, Function = "PBDKF2" }; var key = new Rfc2898DeriveBytes(password, keyDer.Salt, keyDer.WorkFactor); provider.Key = key.GetBytes(provider.KeySize / 8); aesModel.InitializationVector = provider.IV; aesModel.KeyDerivation = keyDer; var transform = provider.CreateEncryptor(); var encryptedByte = transform.TransformFinalBlock(Encoding.UTF8.GetBytes(cleartext), 0, cleartext.Length); aesModel.Payload = Convert.ToBase64String(encryptedByte); var stringAes = JsonSerializer.Serialize(aesModel); if (string.IsNullOrWhiteSpace(stringAes)) { throw new NotFoundException($"Could not Serialize {nameof(aesModel)}."); } return(stringAes); }