Вероятно, это происходит потому, что произвольная последовательность случайных байтов не обязательно может быть преобразована в допустимую строку Юникода.
Когда ваши случайные байты конвертируются в допустимый юникод, тогда ваше кодирование / декодирование будет работать без ошибок; когда они не конвертируемы, у вас будут проблемы.
Если вам нужно строковое представление случайной последовательности байтов, то вам, вероятно, следует использовать кодировку Base-64:
string salt = Convert.ToBase64String(saltBytes);
byte[] saltBytes2 = Convert.FromBase64String(salt);