Проблема прямо здесь:
string passe = System.Text.Encoding.UTF8.GetString(encrypted);
^---------------------------------^
, а затем здесь:
string decrypted = Decrypt(System.Text.Encoding.UTF8.GetBytes(passe), aes.Key, aes.IV);
^--------------------------------^
Я предполагаю, что это ваша симуляция хранения ее в базе данных, а затем ее возврата, исохраняя его как строку.
Однако то, что вы сделали, почти наверняка повредило строку таким образом.
Encoding.UTF8.GetString(bytes)
делает не преобразование байтового массива, содержащегопроизвольные байты в строку.Вместо этого он преобразует байтовый массив , который должен содержать байты, составляющие строку в кодировке UTF8, обратно в эту строку.
Если байтовый массив содержит произвольные байты, например, результат шифрованиятекст, этот шаг и его компаньон Encoding.UTF8.GetBytes
почти наверняка повредят данные и / или потеряют байты.
Вместо этого следует использовать другой метод преобразования байтового массива в строку и обратно.
Одним из способов было бы использование кодировки Base64, и вы можете заменить две строки выше на это:
string passe = Convert.ToBase64String(encrypted);
...
string decrypted = Decrypt(Convert.FromBase64String(passe), aes.Key, aes.IV);
Это приведет к тому, что ваша программа зашифрует, а затем расшифрует строку очень хорошо.
Кроме того, вы можете захотеть сохранить байты в вашей базе данных напрямую.В зависимости от вашего движка базы данных может быть хорошая поддержка для хранения байтовых массивов напрямую, без всяких проблем с преобразованиями строк любого вида.