itertools.cycle(key) возвращает итератор, в котором по очереди циклично выдаются символы из key (то есть, если итерация дойдёт до последнего символа из key, то следующим он вернет первый символ из key и так без конца).
zip(string, key) возвращает итератор кортежей, каждую итерацию берутся элементы из каждого аргумента (в данном случае string и key) и возвращается кортеж этих элементов до тех пор, пока во всех итераторах остаются элементы.
Внутри цикла берется один символ шифруемого текста, один символ ключа, берутся их коды, находится XOR этих кодов а в список добавляется символ с получившимся кодом.
В конце просто все символы списка склеиваются в одну строку.