Ошибка расшифровки ASP.NET Rijndael: недопустимая длина данных для расшифровки

Итак, имея только что получил ключ, который нужно принять, и получил зашифрованную строку длиной 44 символа, теперь я не могу расшифровать (аааргхх):

Длина данных для расшифровки недействительна.

Оглядевшись и прочитав различные сообщения, похоже, что преобразование в Base64String может быть проблемой, но я не вижу, где это неправильно - многие из решений, которые я видел, кажутся идентичными тому, что у меня есть. Опять же, я был бы очень признателен за любую помощь - выдержки ниже:

Функция шифрования/дешифрования

Private byteKey As Byte() = Encoding.UTF8.GetBytes("B499F4BF48242E05548D1E4C8BB26A2E")
Private byteIV As Byte() = Encoding.UTF8.GetBytes(",%u'm&'CXSy/T7x;4")

Private Function Rijndael(ByVal sInput As String, ByVal bEncrypt As Boolean) As String
    ' Create an instance of encyrption algorithm. 
    Dim _rijndael As New RijndaelManaged()
    ' Create an encryptor using key and IV - already available in byte() as byteKey and byteIV
    Dim transform As ICryptoTransform
    If bEncrypt Then
        transform = _rijndael.CreateEncryptor(byteKey, byteIV)
    Else
        transform = _rijndael.CreateDecryptor(byteKey, byteIV)
    End If
    ' Create streams for input and output 
    Dim msOutput As New System.IO.MemoryStream()
    Dim msInput As New CryptoStream(msOutput, transform, CryptoStreamMode.Write)
    ' Feed data into the crypto stream. 
    msInput.Write(Encoding.UTF8.GetBytes(sInput), 0, Encoding.UTF8.GetBytes(sInput).Length)
    ' Flush crypto stream. 
    msInput.FlushFinalBlock()
    Dim byteOutput As Byte() = msOutput.ToArray
    Return Convert.ToBase64String(byteOutput)
End Function

Использование:

Dim sEncrypted As String = Rijndael("This is a test", True)
Dim sDecrypted As String = Rijndael(sEncrypted, False) **This is the line where it is crashing**

EDIT - Окончательная, казалось бы, рабочая пара функций (см. комментарий) для ссылки:

Private byteKey As Byte() = Encoding.UTF8.GetBytes("B499F4BF48242E05548D1E4C8BB26A2E")
Private byteIV As Byte() = Encoding.UTF8.GetBytes(",%u'm&'CXSy/T7x;4")

Public Function Encrypt(ByVal sInput As String) As String
    ' Create an instance of our encyrption algorithm. 
    Dim _rijndael As New RijndaelManaged()
    ' Create an encryptor using our key and IV 
    Dim transform As ICryptoTransform
    transform = _rijndael.CreateEncryptor(byteKey, byteIV)
    ' Create the streams for input and output 
    Dim msOutput As New System.IO.MemoryStream()
    Dim msInput As New CryptoStream(msOutput, transform, CryptoStreamMode.Write)
    ' Feed our data into the crypto stream 
    msInput.Write(Encoding.UTF8.GetBytes(sInput), 0, Encoding.UTF8.GetBytes(sInput).Length)
    msInput.FlushFinalBlock()
    Return Convert.ToBase64String(msOutput.ToArray)
End Function

Public Function Decrypt(ByVal sInput As String) As String
    ' Create an instance of our encyrption algorithm. 
    Dim _rijndael As New RijndaelManaged()
    ' Create an encryptor using our key and IV 
    Dim transform As ICryptoTransform
    transform = _rijndael.CreateDecryptor(byteKey, byteIV)
    ' Create the streams for input and output 
    Dim msOutput As New System.IO.MemoryStream()
    Dim msInput As New CryptoStream(msOutput, transform, CryptoStreamMode.Write)
    ' Feed our data into the crypto stream. 
    msInput.Write(Convert.FromBase64String(sInput), 0, Convert.FromBase64String(sInput).Length)
    msInput.FlushFinalBlock()
    Return Encoding.UTF8.GetString(msOutput.ToArray)
End Function

использование

Dim sEncrypted As String = Encrypt("This is a test")
Dim sDecrypted As String = Decrypt(sEncrypted) 

person Chris    schedule 02.12.2009    source источник
comment
Это один из случаев, когда логический параметр сообщает вам, что на самом деле это две разные подпрограммы — в этом случае подпрограмму 1 нужно запустить в обратном порядке, чтобы получилась подпрограмма 2.   -  person Steve Gilham    schedule 03.12.2009
comment
Оглядываясь назад, очень справедливый комментарий, учитывая разницу между ними с момента исправления - изначально (и ошибочно) их было не так много, поэтому так оно и было - я живу и учусь. Проголосуйте за комментарий за то, что он стоит! Спасибо.   -  person Chris    schedule 03.12.2009
comment
Спасибо, что опубликовали свой ответ, я ценю это. Моя проблема, как и ваша, заключалась в том, что я поменял местами Encoding.UTF8.GetString() и Convert.ToBase64String().   -  person Dominic K    schedule 29.07.2010


Ответы (1)


Если вы собираетесь преобразовать его в base64, вам придется декодировать его с помощью Base64. На данный момент вы берете выходной массив байтов Base64, а затем используете UTF8 для преобразования его обратно в байты, что дает вам совершенно другое значение.

Следует использовать Convert.FromBase64String вместо UTF8 для изменение строки на байты при декодировании, а затем использование UTF8 вместо Base64 для интерпретации данных.

EG: О декодировании, которое вы хотели бы

msInput.Write(Convert.FromBase64String(sInput), 0, Convert.FromBase64String(sInput).Length)

И для возврата при декодировании:

Return Encoding.UTF8.GetString(byteOutput)
person fyjham    schedule 02.12.2009