>>> Arcfour('Key').process('Plaintext').encode('hex') 'bbf316e8d940af0ad3' >>> Arcfour('Wiki').process('pedia').encode('hex') '1021bf0420' >>> Arcfour('Secret').process('Attack at dawn').encode('hex') '45a01f645fc35b383552544b9bf5'
| 9 | ## Arcfour |
| 10 | ## |
| 11 | class Arcfour(object): |
| 12 | |
| 13 | """ |
| 14 | >>> Arcfour('Key').process('Plaintext').encode('hex') |
| 15 | 'bbf316e8d940af0ad3' |
| 16 | >>> Arcfour('Wiki').process('pedia').encode('hex') |
| 17 | '1021bf0420' |
| 18 | >>> Arcfour('Secret').process('Attack at dawn').encode('hex') |
| 19 | '45a01f645fc35b383552544b9bf5' |
| 20 | """ |
| 21 | |
| 22 | def __init__(self, key): |
| 23 | s = range(256) |
| 24 | j = 0 |
| 25 | klen = len(key) |
| 26 | for i in xrange(256): |
| 27 | j = (j + s[i] + ord(key[i % klen])) % 256 |
| 28 | (s[i], s[j]) = (s[j], s[i]) |
| 29 | self.s = s |
| 30 | (self.i, self.j) = (0, 0) |
| 31 | return |
| 32 | |
| 33 | def process(self, data): |
| 34 | (i, j) = (self.i, self.j) |
| 35 | s = self.s |
| 36 | r = '' |
| 37 | for c in data: |
| 38 | i = (i+1) % 256 |
| 39 | j = (j+s[i]) % 256 |
| 40 | (s[i], s[j]) = (s[j], s[i]) |
| 41 | k = s[(s[i]+s[j]) % 256] |
| 42 | r += chr(ord(c) ^ k) |
| 43 | (self.i, self.j) = (i, j) |
| 44 | return r |
| 45 | |
| 46 | # test |
| 47 | if __name__ == '__main__': |
no outgoing calls
no test coverage detected
searching dependent graphs…