Generating the Keys
When the MTNG is first started, a single seed stream, Xn, is generated by a simple PRNG from a fixed seed value (IV) and is allowed to cycle for a fixed number of operations, calculating a new 64-bit random number (Xi) every 11ns (about 93 million seed values per second). The number of operations in each cycle depends on the value of Xi and the number of milliseconds indicated by the system clock at the beginning of the cycle. At the end of the each cycle, the polarity of the random number is reversed switching to a new part of the Xn sequence that can only be predicted from the value of Xi at the end of the cycle.
where A(i) is the ith element of the array and X1i is the ith random number from the first stream.
The purpose of the inversion is to move Xi onto another section of the Xn chain. This is necessary because even at 93 million new values per second, it would take over 4000 years to generate all 264 possible values, which means that without the reversals, an attacker would only need to check a limited number of possible seed values. After the required number of such cycles, the system clock is checked to see if it indicates a multiple of 10ms. If not, the cycles continue until the end of a cycle when a multiple of 10ms is indicated.
To create each tandem PRNG seed, the process is repeated until the system clock indicates a multiple of 10 ms. At this point, the current value of the seed, Xi, is captured as the seed. The current value is once again inverted. The whole process is repeated until all eight seeds have been generated. Because the value of Xi is updated every 11ns, it is regarded as incredible that the same chain could be replicated, even by the same MTNG, so the value of the seed can be regarded as truly random.
After eight values have been captured, the MTNG primes the arrays and generates 4 streams, each of 256 random numbers in the range 0 - 255. The 4 streams are used for the initial values assigned to the Humber registers, 1 stream to each of two index registers and two shift registers. Every random process is generated by its own tandem PRNG, using two different random number sequences, both with a unique, non-predictable, initial seed. Each of the four streams is generated by a separate tandem PRNG. Every key value is converted to a hexadecimal pair and the values are saved to a FORTRAN file as 64 streams of 16 hexadecimal pairs for inclusion in the compilation to create an embedded key in the Humber executable.