0

Я использую Visual Basic.NET и имею следующий System.Security.Cryptography.CryptographicException исключение:Cryptography Перетяжка недействительно исключение

Перетяжка недействительна и не может быть удалена.

Вот мой код:

Public Sub SaveEncryptedObjectToFile(FileName As String, Item As Object) 
    Dim fs As FileStream 
    Dim encryptor As CryptoStream 

    Dim formatter As New BinaryFormatter 

    Dim password As String = "MyPassword" 
    Dim salt As String = "InitialVector123" 

    Dim AES As AesManaged = New AesManaged 
    AES.Padding = PaddingMode.PKCS7 
    AES.Mode = CipherMode.CBC 

    Dim HashAlgorithm As String = "SHA1" 'Can be SHA1 or MD5 
    Dim PasswordIterations As Integer = 2 
    Dim InitialVector As String = "InitialVector123" 'This should be a string of 16 ASCII characters. 
    Dim KeySize As Integer = 256 'Can be 128, 192, or 256. 

    Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector) 
    Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt) 
    Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(password, SaltValueBytes, HashAlgorithm, PasswordIterations) 
    Dim KeyBytes As Byte() = DerivedPassword.GetBytes(CInt(KeySize/8)) 

    Dim encryptTransf As ICryptoTransform = AES.CreateEncryptor(KeyBytes, InitialVectorBytes) 

    fs = New FileStream(FileName, FileMode.Create) 
    encryptor = New CryptoStream(fs, encryptTransf, CryptoStreamMode.Write) 

    Try 
     formatter.Serialize(encryptor, Item) 
    Catch e As SerializationException 
     Console.WriteLine("Failed to serialize. Reason: " & e.Message) 
     Throw 
    Finally 
     fs.Close() 
    End Try 
End Sub 

Public Function OpenEncryptedObjectFromFile(FileName As String) As Object 
    Dim fs As New FileStream(FileName, FileMode.Open) 
    Dim decryptor As CryptoStream 

    Dim ItemToReturn As New Object 

    Dim password As String = "MyPassword" 
    Dim salt As String = "InitialVector123" 

    Dim AES As AesManaged = New AesManaged 
    AES.Padding = PaddingMode.PKCS7 
    AES.Mode = CipherMode.CBC 

    Dim HashAlgorithm As String = "SHA1" 'Can be SHA1 or MD5 
    Dim PasswordIterations As Integer = 2 
    Dim InitialVector As String = "InitialVector123" 'This should be a string of 16 ASCII characters. 
    Dim KeySize As Integer = 256 'Can be 128, 192, or 256. 

    Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector) 
    Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt) 
    Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(password, SaltValueBytes, HashAlgorithm, PasswordIterations) 
    Dim KeyBytes As Byte() = DerivedPassword.GetBytes(CInt(KeySize/8)) 
    'Dim KeyBytes As Byte() = Rfc2898DeriveBytes(CInt(KeySize/8)) 

    Dim decryptTrans As ICryptoTransform = AES.CreateDecryptor(KeyBytes, InitialVectorBytes) 

    Try 
     Dim formatter As New BinaryFormatter 

     decryptor = New CryptoStream(fs, decryptTrans, CryptoStreamMode.Read) 
     ItemToReturn = DirectCast(formatter.Deserialize(decryptor), Object) 
     Return ItemToReturn 
    Catch e As SerializationException 
     Console.WriteLine("Failed to deserialize. Reason: " & e.Message) 
     Throw 
    Finally 
     fs.Close() 
    End Try 
End Function 

Исключение происходит в следующей строке:

ItemToReturn = DirectCast(formatter.Deserialize(decryptor), Object) 

Я не уверен, если это имеет какое-либо отношение к CryptographicException, но я в настоящее время получив следующее предупреждение:

«Открытая функция переопределения G etBytes (cb As Integer) Поскольку Byte() 'устарел: «Rfc2898DeriveBytes заменяет PasswordDeriveBytes для получения ключевого материала из пароля и является предпочтительным в новых приложениях».

На этой линии:

Dim KeyBytes As Byte() = DerivedPassword.GetBytes(CInt(KeySize/8)) 

Я поглядела на сайте и не могут найти рабочее решение для этого предупреждения.

ответ

0

Чтобы диагностировать проблему, вам необходимо посмотреть, что производится. Измените сторону расшифровки, чтобы не ожидать отступов. Это позволит ему пройти мимо исключения и произвести что-то.

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

+0

OK, спасибо. Я выключил прокладку. Теперь файл сохраняется и файл может быть расшифрован. Какое дополнение вы рекомендуете? –

+0

PKCS7 подходит для заполнения. Не ** ** не оставляйте отступы, он маскирует реальную проблему. Заполнение удаляется после дешифрования, а не раньше, так что у вас есть какая-то другая проблема. Вы проверили ключи? – rossum

Смежные вопросы