ReverseKey([]byte) vs ReverseKey(string)
It looks like some of the processing stuff since I originally looked at this and after a quick scan I'm not sure if this would work in the context of the way the tools are handling the keys, but ReverseKey would be significantly faster than the updated version of ReverseKey, ~60%, and ~75% than the original implementation, in the case of larger keys, if it accepted a []byte instead of a string.
A slice header is 24 bytes in a 64 bit system. Since all ReverseKeys does is swap the byte values, it's save to have func ReverseKey(b []byte) {...} as the func signature and just swap the bytes on the slice and not return anything.
This would also save the copying of the string into the func, converting the string to a slice, converting it back to a string, and returning it.
Also, it looks like the key often starts out a []byte so it would also save that conversion. It also looks like the key is sometimes a string; but then that data gets converted to a string before being sent on the channel. I don't think that allocation can be avoided even if it is kept a slice.
Just a suggestion.