using System.Security.Cryptography;
public static void Main()
var key = new Guid("74839EC4-F913-4C47-8B62-A6458B5E5DD0");
var mask = ToDeterministicGuid("planmanagement.member.statementgenerated");
var masked = MaskWith(key, mask);
Console.WriteLine(masked);
private static Guid MaskWith(Guid guid, Guid mask)
var guidBytes = guid.ToByteArray();
var maskBytes = mask.ToByteArray();
var guidNumber1 = BitConverter.ToUInt64(guidBytes, 0);
var guidNumber2 = BitConverter.ToUInt64(guidBytes, 8);
var maskNumber1 = BitConverter.ToUInt64(maskBytes, 0);
var maskNumber2 = BitConverter.ToUInt64(maskBytes, 8);
var masked1 = guidNumber1 ^ maskNumber1;
var masked2 = guidNumber2 ^ maskNumber2;
var maskedBytes = BitConverter.GetBytes(masked1).Concat(BitConverter.GetBytes(masked2)).ToArray();
return new Guid(maskedBytes);
private static Guid ToDeterministicGuid(string input)
throw new ArgumentNullException(nameof(input));
var provider = new MD5CryptoServiceProvider();
var inputBytes = Encoding.Default.GetBytes(input);
var hashBytes = provider.ComputeHash(inputBytes);
return new Guid(hashBytes);