Я использую 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))
Я поглядела на сайте и не могут найти рабочее решение для этого предупреждения.
OK, спасибо. Я выключил прокладку. Теперь файл сохраняется и файл может быть расшифрован. Какое дополнение вы рекомендуете? –
PKCS7 подходит для заполнения. Не ** ** не оставляйте отступы, он маскирует реальную проблему. Заполнение удаляется после дешифрования, а не раньше, так что у вас есть какая-то другая проблема. Вы проверили ключи? – rossum