#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: нет, не существует «стандартного» размера файла, о котором вам нужно беспокоиться… но помните: когда вы загружаете файл в память, оперативная память оказывается занятой… таким образом, чем больше файл, тем больше объем потребляемой памяти.