defrc4_ksa(key): """Key Scheduling Algorithm (KSA)""" key = [ord(c) for c in key] S = list(range(256)) j = 0 for i inrange(256): j = (j + S[i] + key[i % len(key)]) % 256 S[i], S[j] = S[j], S[i] return S
defrc4_prga(S, data_len): """Pseudo-Random Generation Algorithm (PRGA)""" i = j = 0 keystream = [] for _ inrange(data_len): i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] K = S[(S[i] + S[j]) % 256] keystream.append(K) return keystream
defrc4_crypt(data: bytes, key: str) -> bytes: """Encrypt or decrypt data using RC4""" S = rc4_ksa(key) keystream = rc4_prga(S, len(data)) returnbytes([b ^ k for b, k inzip(data, keystream)])