Нечего там создавать то.. берем алфавит и перебираем его размещения с повторениями. Вот так тупо:
from itertools import *
symbols = 'abc123'
length = 4
for i in product(symbols, repeat=length):
print(''.join(i)) В строку symbols вписываем все символы какие могут быть в пароле. Регистр учитывается, поэтому алфавит должен быть вписан в двойном экземпляре: строчные и прописные. В length длину пароля. На выходе получаем поток строк из всех возможных комбинаций. Можно строку куда-то передать, разумеется.
Ну и число размещений с повторениями это всё ещё n^k. 26 букв прописных + 26 букв строчных + 10 цифр. Если у нас пароль из 8 символов, то это 62^8 = 218340105584896 вариантов. Для осознания скорости такого подхода предлагаю указанной выше программе задать числа от 0 до 9 и сгенерировать все пароли из 4 цифр. Так вот это будет всего 10.000 штук (в 21 млрд раз меньше). Добавите туда ещё кириллицу и число вариантов улетит в космос. Перебирать их будете лет эдак 8..миллионов.