Итак, я пытаюсь создать систему, в которой я сериализую словарь, затем шифрую его, а затем могу расшифровать, а затем восстановить словарь.
Он также включает в себя некоторые операторы выбора, основанные на настройке, в соответствии с которой пользователь устанавливает, следует ли всегда, никогда или запрашивать шифрование.
Я пытался следовать документации по классу CryptoStream, но по какой-то причине это не работает. Я думаю, что шифрование может работать, но файл намного меньше, чем незашифрованный эквивалент .ser, поэтому я не знаю. Расшифровка генерирует «Попытка десериализации пустого потока». ошибка, которая довольно понятна, но я не могу понять, как ее исправить.
Резервное копирование и восстановление работают нормально без шифрования.
Вот соответствующие подпрограммы (и ссылка GIT, если это проще), и любая помощь будет очень признательна! Это для вычислительного проекта уровня A, поэтому я не слишком беспокоюсь о фактической силе шифрования (на самом деле не хочу начинать возиться с хешированием и солением), просто это работает.
Зашифровать резервную копию:
Private Sub encryptBackup()
Dim key As Byte()
Dim IV As Byte() = New Byte() {}
Using MD5 As New MD5CryptoServiceProvider
Dim tmp = System.Text.Encoding.UTF8.GetBytes(InputBox("Please insert password:", "Password Input") & "This is most definitely not an obtuse amount of salt")
key = MD5.ComputeHash(tmp)
IV = MD5.ComputeHash(key)
End Using
Using cryptoRijndael = Rijndael.Create()
Dim cryptoCryptor As ICryptoTransform = cryptoRijndael.CreateEncryptor(key, IV)
Using fStream As New FileStream(fldBackupJobs & "\Backup Files\" & Strings.Replace(Strings.Replace(Now, ":", "_"), "/", ".") & ".bin", FileMode.OpenOrCreate), cStream As New CryptoStream(fStream, cryptoCryptor, CryptoStreamMode.Write)
Dim Formatter As New BinaryFormatter
Formatter.Serialize(cStream, photoJobs)
MsgBox("Written to file")
End Using
End Using
End Sub
Расшифровать резервную копию:
Private Sub decryptBackup(pathsStr As String)
photoJobs = Nothing
Dim key As Byte()
Dim IV As Byte() = New Byte() {}
Using MD5 As New MD5CryptoServiceProvider
Dim tmp = System.Text.Encoding.UTF8.GetBytes(InputBox("Please insert password:", "Password Input") & "This is most definitely not an obtuse amount of salt")
key = MD5.ComputeHash(tmp)
IV = MD5.ComputeHash(key)
End Using
Using cryptoRijndael = Rijndael.Create()
Dim cryptoCryptor As ICryptoTransform = cryptoRijndael.CreateEncryptor(key, IV)
pathstr = OpenFileDialog.FileName
Using fStream As New FileStream(pathstr, FileMode.Open), cStream As New CryptoStream(fStream, cryptoCryptor, CryptoStreamMode.Read)
Dim Formatter As New BinaryFormatter
photoJobs = CType(Formatter.Deserialize(cStream), Dictionary(Of String, PhotoJob))
MsgBox("Backup Restored")
End Using
End Using
End Sub
И ссылка GIT: https://github.com/hughesjs/Photo-Gift-Manager
Заранее спасибо!!
cryptoRijndael.CreateDecryptor(key, IV)
он создает ENcrpytor (см. примечание выше о точности). Лучший способ создания/управления именами файлов представлен вSystem.IO.Path
измельчении строк на биты, и бобы могут очень быстро выйти из строя. 14.04.2015