using System.Security.Cryptography;
public static void Main(string[] args)
string uniqueSoftwareKey = "YourSoftwareKeyHere";
string fakeMacAddress = "00-14-22-01-23-45";
SecurityModel securityModel = new SecurityModel
PurchaseCode = "7b153b71-ea9e-4fe1-ab25-b7ba31b66d60",
itemId = "T2VqYktRUzd3R3J6UFBjaG1yMUMrQT09"
string generatedKey = GenerateKey(fakeMacAddress, uniqueSoftwareKey, securityModel);
Console.WriteLine("Generated Key: " + generatedKey);
SecurityModel decryptedModel = Decrypt(generatedKey);
Console.WriteLine("Decrypted Purchase Code: " + decryptedModel.PurchaseCode);
Console.WriteLine("Decrypted Item ID: " + decryptedModel.itemId);
public static string GenerateKey(string macAddress, string uniqueSoftwareKey, SecurityModel securityModel)
string keyMaterial = macAddress + uniqueSoftwareKey;
return Encrypt(securityModel, keyMaterial);
public static string Encrypt(SecurityModel securityModel, string keyMaterial)
string strPassword = "hhL:WV*7<dgeKY)fjTe>'[9+`GyzS&]3;k8UGKK_&2]!";
string salt = "q$3}T&qtpTJ>q\t/'/;wh!#%H77e'3AXA(*(qcL%=**)";
string strHashName = "SHA1";
string ivString = "@1B2c3D4e5F6g7H8";
byte[] iv = Encoding.ASCII.GetBytes(ivString);
byte[] saltBytes = Encoding.ASCII.GetBytes(salt);
byte[] keyBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(securityModel));
PasswordDeriveBytes passwordDeriveBytes = new PasswordDeriveBytes(strPassword, saltBytes, strHashName, iterations);
byte[] key = passwordDeriveBytes.GetBytes(keySize / 8);
RijndaelManaged rijndaelManaged = new RijndaelManaged();
rijndaelManaged.Mode = CipherMode.CBC;
ICryptoTransform encryptor = rijndaelManaged.CreateEncryptor(key, iv);
using (MemoryStream memoryStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
cryptoStream.Write(keyBytes, 0, keyBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] encryptedBytes = memoryStream.ToArray();
return Convert.ToBase64String(encryptedBytes);
public static SecurityModel Decrypt(string cipherText)
string strPassword = "hhL:WV*7<dgeKY)fjTe>'[9+`GyzS&]3;k8UGKK_&2]!";
string salt = "q$3}T&qtpTJ>q\t/'/;wh!#%H77e'3AXA(*(qcL%=**)";
string strHashName = "SHA1";
string ivString = "@1B2c3D4e5F6g7H8";
byte[] iv = Encoding.ASCII.GetBytes(ivString);
byte[] saltBytes = Encoding.ASCII.GetBytes(salt);
byte[] cipherBytes = Convert.FromBase64String(cipherText);
PasswordDeriveBytes passwordDeriveBytes = new PasswordDeriveBytes(strPassword, saltBytes, strHashName, iterations);
byte[] key = passwordDeriveBytes.GetBytes(keySize / 8);
RijndaelManaged rijndaelManaged = new RijndaelManaged();
rijndaelManaged.Mode = CipherMode.CBC;
ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(key, iv);
using (MemoryStream memoryStream = new MemoryStream(cipherBytes))
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
byte[] decryptedBytes = new byte[cipherBytes.Length];
int decryptedByteCount = cryptoStream.Read(decryptedBytes, 0, decryptedBytes.Length);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes, 0, decryptedByteCount);
return JsonConvert.DeserializeObject<SecurityModel>(decryptedText);
public class SecurityModel
public string PurchaseCode { get; set; }
public string itemId { get; set; }