arcfour.py 927 B

1234567891011121314151617181920212223242526272829303132333435
  1. """Python implementation of Arcfour encryption algorithm.
  2. See https://en.wikipedia.org/wiki/RC4
  3. This code is in the public domain.
  4. """
  5. from typing import Sequence
  6. class Arcfour:
  7. def __init__(self, key: Sequence[int]) -> None:
  8. # because Py3 range is not indexable
  9. s = [i for i in range(256)]
  10. j = 0
  11. klen = len(key)
  12. for i in range(256):
  13. j = (j + s[i] + key[i % klen]) % 256
  14. (s[i], s[j]) = (s[j], s[i])
  15. self.s = s
  16. (self.i, self.j) = (0, 0)
  17. def process(self, data: bytes) -> bytes:
  18. (i, j) = (self.i, self.j)
  19. s = self.s
  20. r = b""
  21. for c in iter(data):
  22. i = (i + 1) % 256
  23. j = (j + s[i]) % 256
  24. (s[i], s[j]) = (s[j], s[i])
  25. k = s[(s[i] + s[j]) % 256]
  26. r += bytes((c ^ k,))
  27. (self.i, self.j) = (i, j)
  28. return r
  29. encrypt = decrypt = process