Недопустимый символ в строке Base-64 при попытке расшифровки - PullRequest
0 голосов
/ 13 апреля 2011

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

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 Ответ

1 голос
/ 13 апреля 2011

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

...