4 символа в ключе - очень мало, это 34 в степени 4 вариантов перебора
т.е. достаточно написать быструю функцию определения корректности текста (например проверять наличие существующего слова или его части, слоги, предлоги, корни) и прогнать тупым перебором весь диапазон, вызывая эту функцию для каждой комбинации.
Более умно - воспользоваться знанием количества символов в ключе, т.е. достаточно перебирать по одному символу и рассматривать только 33 варианта но когда от исходного текста видно только каждый 4-тый символ. Т.е. необходимо улучшить функцию определению корректности текста, чтобы она смогла хотя бы дать вероятность того, что вот именно этот символ дает похожий на правду текст (например частоты появления той или иной буквы на определенной позиции плюс длины слов через пробел и т.п.) тогда вместо перебора значений ключа от 1 до 33 нужно определить эти значения в порядок через вероятность быть именно этим символом верным, и начинать перебор со значений с большей вероятностью а значит ответ с высокой вероятностью будет найден в начале перебора а не 33,33,33,33.
Любые улучшения алгоритма крутятся вокруг каких то знаниях об зашифрованном сообщении.