arcfour.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env python
  2. """ Python implementation of Arcfour encryption algorithm.
  3. This code is in the public domain.
  4. """
  5. ## Arcfour
  6. ##
  7. class Arcfour(object):
  8. """
  9. >>> Arcfour('Key').process('Plaintext').encode('hex')
  10. 'bbf316e8d940af0ad3'
  11. >>> Arcfour('Wiki').process('pedia').encode('hex')
  12. '1021bf0420'
  13. >>> Arcfour('Secret').process('Attack at dawn').encode('hex')
  14. '45a01f645fc35b383552544b9bf5'
  15. """
  16. def __init__(self, key):
  17. s = range(256)
  18. j = 0
  19. klen = len(key)
  20. for i in xrange(256):
  21. j = (j + s[i] + ord(key[i % klen])) % 256
  22. (s[i], s[j]) = (s[j], s[i])
  23. self.s = s
  24. (self.i, self.j) = (0, 0)
  25. return
  26. def process(self, data):
  27. (i, j) = (self.i, self.j)
  28. s = self.s
  29. r = ''
  30. for c in data:
  31. i = (i+1) % 256
  32. j = (j+s[i]) % 256
  33. (s[i], s[j]) = (s[j], s[i])
  34. k = s[(s[i]+s[j]) % 256]
  35. r += chr(ord(c) ^ k)
  36. (self.i, self.j) = (i, j)
  37. return r
  38. # test
  39. if __name__ == '__main__':
  40. import doctest
  41. doctest.testmod()