Недопустимый символ в строке Base-64 при попытке расшифровки

#cryptography #base64 #encryption

#криптография #base64 #шифрование

Вопрос:

У меня есть метод шифрования / дешифрования, который работает просто отлично, за одним исключением. Когда я пытаюсь прочитать зашифрованный текст из текстового файла, а затем расшифровать его, я получаю следующую ошибку.

Invalid character in a Base-64 string

Странно то, что если я просто прочитаю зашифрованный текст в текстовое поле, а затем скопирую и вставлю его в другое текстовое поле, которое расшифровывает, используя тот же метод дешифрования, это работает просто отлично. Ошибок нет, и расшифровка продолжается. Я перечисляю метод дешифрования и способ, используемый для чтения в текстовом файле ниже.

Метод расшифровки

    Public Shared Function DecryptUserString(ByRef cipheredText As String, ByRef password As String) As String
      Dim RijndaelManagedObj As New RijndaelManaged
      Dim RijndaelEncObj As ICryptoTransform, MD5Obj As New MD5CryptoServiceProvider
      Dim DecryptedBytes As Byte(), EncryptedData As Byte()
      Dim PasswordBytes As Byte() = New ASCIIEncoding().GetBytes(password)
      Dim UTF8Encoding As System.Text.Encoding = System.Text.Encoding.UTF8

      'A modified Base64 is sent with ~ and -  so it can be sent as a form post
      EncryptedData = Convert.FromBase64String(Replace(Replace(cipheredText, "~", " "), "-", "="))

      RijndaelManagedObj.BlockSize = 128
      RijndaelManagedObj.KeySize = 128
      RijndaelManagedObj.Mode = CipherMode.ECB
      RijndaelManagedObj.Padding = PaddingMode.None
      RijndaelManagedObj.Key = MD5Obj.ComputeHash(PasswordBytes)
      RijndaelEncObj = RijndaelManagedObj.CreateDecryptor()

      DecryptedBytes = RijndaelEncObj.TransformFinalBlock(EncryptedData, 0, EncryptedData.Length)

      If DecryptedBytes.Length > 0 Then
         DecryptUserString = UTF8Encoding.GetString(DecryptedBytes, 0, DecryptedBytes.Length)
         If DecryptedBytes.Length = 0 Then DecryptUserString = New ASCIIEncoding().GetString(DecryptedBytes)
      Else
         DecryptUserString = ""
      End If
   End Function
  

Способ чтения текста из файла

   Private Function ReadText(ByVal TextFilePath As String) As String
    Using ReadStream As FileStream = File.OpenRead(TextFilePath)
      Dim FileTextBuilder As New StringBuilder()
      Dim DataTransit As Byte() = New Byte(ReadStream.Length) {}
      Dim DataEncoding As New UTF8Encoding(True)
      While ReadStream.Read(DataTransit, 0, DataTransit.Length) > 0
          FileTextBuilder.Append(DataEncoding.GetString(DataTransit))
      End While
      Return FileTextBuilder.ToString()
    End Using
  End Function
  

Ответ №1:

Вы не можете использовать File.ReadAllText() метод для чтения всего файла и последующего дешифрования так же, как вы делаете с текстовыми полями?
Я знаю, что если файл огромен, это не очень хорошая идея, но вы можете попробовать проверить, хорошо ли файл сохранен или вы плохо его читаете.

Комментарии:

1. Это сработало! Мой файл всегда будет меньше 20 кб. Есть ли размер файла, о котором мне нужно беспокоиться? Еще раз спасибо!

2. @webworm: нет, не существует «стандартного» размера файла, о котором вам нужно беспокоиться… но помните: когда вы загружаете файл в память, оперативная память оказывается занятой… таким образом, чем больше файл, тем больше объем потребляемой памяти.