73 lines
2.2 KiB
C#
73 lines
2.2 KiB
C#
using System;
|
|
|
|
namespace Longhorn_TN3270
|
|
{
|
|
/**
|
|
* This was a fun project, had me racking my brain for about a week
|
|
* Thanks for the puzzle!
|
|
*/
|
|
internal class Keygen
|
|
{
|
|
private readonly Random _rnd = new Random();
|
|
public string Generate(string userName)
|
|
{
|
|
// licence much have a total length of 10
|
|
char[] licence = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
|
|
|
|
// populate every other char with random bytes
|
|
for (var i = 2; i < licence.Length; i += 2)
|
|
{
|
|
licence[i] = Convert.ToBoolean(_rnd.Next() % 2) ? (char)(_rnd.Next() % 10 + '0') : (char)(_rnd.Next() % 10 + 'D');
|
|
}
|
|
|
|
// populate every other character with the licence
|
|
var iCalcLicence = LicenseCalc(Sanitize(userName.ToUpper()));
|
|
var sCalcLicence = string.Format("{0:D5}", iCalcLicence);
|
|
for (int i = 0, j = 1; i < sCalcLicence.Length; i++, j += 2)
|
|
{
|
|
licence[j] = sCalcLicence[i];
|
|
}
|
|
|
|
// first character must be 0-9
|
|
var sum = 0;
|
|
for (var i = 1; i < licence.Length; i++)
|
|
{
|
|
sum += licence[i] - 48;
|
|
}
|
|
|
|
licence[0] = (char)(sum % 10 + 48);
|
|
|
|
return new string(licence);
|
|
}
|
|
|
|
/**
|
|
* Not gonna lie, this function seems pretty silly
|
|
* but it looks like the origional author (of the C function)
|
|
* seemed to have an off by 2 error and was getting garbage
|
|
* while generating licenses
|
|
*/
|
|
private static string Sanitize(string stringIn)
|
|
{
|
|
char[] t = {' '};
|
|
return stringIn.TrimStart(t);
|
|
}
|
|
|
|
/**
|
|
* Man oh MAN did I go through a whole LOT
|
|
* for 4 measley lines of code
|
|
* Y'all better appreciate this
|
|
*/
|
|
private static int LicenseCalc(string sUserName)
|
|
{
|
|
var sum = 0x5217;
|
|
for (var i = 0; i < sUserName.Length; i++)
|
|
{
|
|
sum += sUserName[i] * 0xa3;
|
|
}
|
|
|
|
return sum & 0xffff;
|
|
}
|
|
|
|
}
|
|
}
|