# key-scheduling algorithm12def KSA(key):34keylength = len(key)5S = range(256)6j = 078for i in range(256):9j = (j + S[i] + key[i % keylength]) % 25610S[i], S[j] = S[j], S[i] # swap11return S1213# pseudo-random generation algorithm1415def PRGA(S):1617i = 018j = 019while True:20i = (i + 1) % 25621j = (j + S[i]) % 25622S[i], S[j] = S[j], S[i] # swap23K = S[(S[i] + S[j]) % 256]24yield K2526def RC4(key):2728def convert_key(s):29return [ord(c) for c in s]30key = convert_key(key)3132S = KSA(key)33return PRGA(S)3435