1 """Pure-Python RC4 implementation.""" 2 3 from RC4 import RC4 4 from cryptomath import * 5 6 def new(key): 7 return Python_RC4(key) 8 9 class Python_RC4(RC4): 10 def __init__(self, key): 11 RC4.__init__(self, key, "python") 12 keyBytes = stringToBytes(key) 13 S = [i for i in range(256)] 14 j = 0 15 for i in range(256): 16 j = (j + S[i] + keyBytes[i % len(keyBytes)]) % 256 17 S[i], S[j] = S[j], S[i] 18 19 self.S = S 20 self.i = 0 21 self.j = 0 22 23 def encrypt(self, plaintext): 24 plaintextBytes = stringToBytes(plaintext) 25 S = self.S 26 i = self.i 27 j = self.j 28 for x in range(len(plaintextBytes)): 29 i = (i + 1) % 256 30 j = (j + S[i]) % 256 31 S[i], S[j] = S[j], S[i] 32 t = (S[i] + S[j]) % 256 33 plaintextBytes[x] ^= S[t] 34 self.i = i 35 self.j = j 36 return bytesToString(plaintextBytes) 37 38 def decrypt(self, ciphertext): 39 return self.encrypt(ciphertext) 40