Tonight I grabbed an old class that uses a pseudo random number generator and implemented it into the TCP client server encryption test. Both the client and server create a new Object of the class and both set the same seed. Both the client and server will grab the next byte and add the next random number to it on a read, on a write, it will subtract the next random byte.
This worked as expected. The following code is an example of a complex random number generator.
public class WLPRNG { long seed; public WLPRNG(long seed) { this.seed = seed; } public int nextInt() { long result = seed + 0x123defca; result = Long.rotateLeft(result, 19); result += 0xbead6789; result *= 0x1234567c; int temp = (int)result; result ^= 0x5ecdab73; result = Long.rotateLeft(result, 48); if (temp % 4 == 0) result *= 0x87650027; result += 13; seed = result; return (int)result; } public byte nextByte() { return (byte)nextInt(); } }
The next step for me to try out is to use and encrypted message from the client which sends the MAC address of the client using encryption, and then both the client and server will communicate using the MAC address as a key for another pseudo random number generator.
Over time, the server can update the encryption methods used by the clients.