As is highlighted in #8, current implementation loses synchronization of the encrypted payloads and disrupting decryption. Sending keep alive messages was initially intended to prevent this and pending resolution of #8 should be sufficient.
However, network disruptions or active wardens may result in a segment of an encrypted message being lost and cause a loss of synchronization. Implement a means of detecting a possible loss of synchronization and a message exchange protocol to re-synchronize the client and server.
Initial thoughts are to have a maximum buffer size established where if a successful decryption is not achieved, the host is marked as desynchronized and keep alive messages are sent from the server to the client. The client will have also registered the desynchronization and begin collecting host IDs and truncating its buffer on the size of a keep alive message which should be static. Upon successful decryption of a keep alive message, the client will then send keep alive messages of its own with the server repeating the same process until it gets a successful decryption an re-establishment of synchronization is achieved.