2011-04-13 73 views
0

我有一種加密/解密方法,可以正常工作,但有一個例外。當我嘗試從文本文件中讀取加密文本並解密時,出現以下錯誤。嘗試解密時Base-64字符串中的字符無效

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()方法讀取整個文件,然後解密方式與使用文本框相同?
我知道,如果文件很大,這不是一個好主意,但是您可以嘗試查看文件是否已妥善保存,或者您是否閱讀得不好。

+0

工作正常!我的文件總是小於20k。有需要擔心的文件大小嗎?再次感謝! – webworm 2011-04-13 16:14:17

+0

@webworm:不,沒有「標準」文件大小,你不得不擔心...但記住:當你在內存中加載文件時,RAM會被佔用......所以文件越大,文件越大消耗的內存量。 – Marco 2011-04-13 17:24:30