package kwm import ( "encoding/binary" "strconv" ) type kwmCipher struct { mask []byte } func newKwmCipher(key []byte) *kwmCipher { return &kwmCipher{mask: generateMask(key)} } func generateMask(key []byte) []byte { keyInt := binary.LittleEndian.Uint64(key) keyStr := strconv.FormatUint(keyInt, 10) keyStrTrim := padOrTruncate(keyStr, 32) mask := make([]byte, 32) for i := 0; i < 32; i++ { mask[i] = keyPreDefined[i] ^ keyStrTrim[i] } return mask } func (c kwmCipher) Decrypt(buf []byte, offset int) { for i := range buf { buf[i] ^= c.mask[(offset+i)&0x1F] // equivalent: [i % 32] } }