byte GetBit(byte data, int bitNumber)
result = (byte)((data >> bitNumber) & 1);
UInt32 CPCNG_GenSeedKeyLevel(UInt32 seedRequest, int level)
UInt32[] hashtable = null;
0, 3, 1, 3, 2, 1, 3, 1, 7, 5, 2, 0
hashtable = new UInt32[8] {
0xE3288EC6, 0x2E789639, 0xE6158894, 0x01506AF7, 0x89E648EA, 0xA84371AA, 0xF19D2734, 0x493DA574
3, 1, 0, 2, 1, 2, 4, 2, 6, 7, 1, 5
hashtable = new UInt32[] {
0xE204E889, 0x13393EA3, 0xEA851438, 0xF3513BEF, 0xA37A2732, 0xAEBAE767, 0x1488EFF5, 0x2964C776
byte[] seed = new byte[] { (byte)(seedRequest >> 24), (byte)(seedRequest >> 16), (byte)(seedRequest >> 8), (byte)seedRequest };
byte n = (byte)(seed[3 - shifttable[1]] ^ seed[3 - shifttable[0]]);
int a = GetBit(seed[3 - shifttable[2]], shifttable[6]);
int b = GetBit(seed[3 - shifttable[3]], shifttable[7]);
int c = GetBit(n, shifttable[8]);
int index = (a << 2) | (b << 1) | c;
UInt32 x = hashtable[index] ^ seedRequest;
a = GetBit(seed[3 - shifttable[4]], shifttable[9]);
b = GetBit(n, shifttable[10]);
c = GetBit((byte)(x >> (8 * shifttable[5])), shifttable[11]);
index = (a << 2) | (b << 1) | c;
UInt32 y = (hashtable[index] >> 8) | (hashtable[index] << 24);
void GenSeedKey(string sSeed)
UInt32 seed = UInt32.Parse(sSeed, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(String.Format("SEED : {0:X8}", seed) + Environment.NewLine);
Console.WriteLine(String.Format("LEVEL11: {0:X8}", CPCNG_GenSeedKeyLevel(seed, 11)) + Environment.NewLine);
Console.WriteLine(String.Format("LEVEL17: {0:X8}", CPCNG_GenSeedKeyLevel(seed, 17)) + Environment.NewLine);