Процесс дешифрования должен быть обратным процессу шифрования. Другими словами, Decrypt(Encrypt(X)) == X
для всех входов X, всех возможных длин, всех возможных значений байтов.
Я предлагаю вам создать тестовый комплект, который будет выполнять несколько попарных проверок со случайными данными, чтобы вы могли доказать себе, что эти два преобразования действительно взаимно компенсируют друг друга. Я имею в виду что-то вроде:
for length from 0 to 1000000:
generate a string of that length with random contents
encrypt it to a fresh memory buffer
decrypt it to a fresh memory buffer
compare the decrypted string with the original string
Сделайте это в первую очередь для строк в памяти, чтобы вы могли изолировать алгоритм от кода обработки файлов.
Как только вы докажете, что алгоритм правильно инвертируется, вы можете сделать то же самое для файлов; как уже говорили другие, у вас могут возникнуть проблемы с обработкой двоичных файлов, это распространенная ошибка.