cipher_map.go 783 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package qmc
  2. import "errors"
  3. type mapCipher struct {
  4. key []byte
  5. box []byte
  6. size int
  7. }
  8. func newMapCipher(key []byte) (*mapCipher, error) {
  9. if len(key) == 0 {
  10. return nil, errors.New("qmc/cipher_map: invalid key size")
  11. }
  12. c := &mapCipher{key: key, size: len(key)}
  13. c.box = make([]byte, c.size)
  14. return c, nil
  15. }
  16. func (c *mapCipher) getMask(offset int) byte {
  17. if offset > 0x7FFF {
  18. offset %= 0x7FFF
  19. }
  20. idx := (offset*offset + 71214) % c.size
  21. return c.rotate(c.key[idx], byte(idx)&0x7)
  22. }
  23. func (c *mapCipher) rotate(value byte, bits byte) byte {
  24. rotate := (bits + 4) % 8
  25. left := value << rotate
  26. right := value >> rotate
  27. return left | right
  28. }
  29. func (c *mapCipher) Decrypt(buf []byte, offset int) {
  30. for i := 0; i < len(buf); i++ {
  31. buf[i] ^= c.getMask(offset + i)
  32. }
  33. }