''' <summary>加密流</summary>
''' <param name="FilePath">流路径</param>
''' <param name="obj">保存的对象</param>
Public Sub CryptographyStream(ByVal FilePath As String, ByVal obj As String)
Dim formatter As New BinaryFormatter
Dim mStream As New MemoryStream
formatter.Serialize(mStream, obj)
Dim rijn As Rijndael = Rijndael.Create
Dim md5 As MD5 = md5.Create
Dim Key() As Byte = md5.ComputeHash(Encoding.Unicode.GetBytes(keyStr))
Dim IV() As Byte = md5.ComputeHash(Encoding.Unicode.GetBytes(ivStr))
Dim fStream As New FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)
Dim cStream As New CryptoStream(fStream, rijn.CreateEncryptor(Key, IV), CryptoStreamMode.Write)
Dim sWriter As New StreamWriter(cStream, Encoding.Unicode)
Dim data() As Char = Encoding.Unicode.GetChars(mStream.ToArray())
sWriter.Write(data)
sWriter.Flush()
sWriter.Close()
cStream.Close()
fStream.Close()
mStream.Close()
End Sub
''' <summary>解密流</summary>
''' <param name="filePath">被解密文件路径</param>
Public Function DecodeStream(ByVal filePath As String)
Dim formatter As New BinaryFormatter
Dim rijn As Rijndael = Rijndael.Create
Dim md5 As MD5 = md5.Create
Dim Key() As Byte = md5.ComputeHash(Encoding.Unicode.GetBytes(keyStr))
Dim IV() As Byte = md5.ComputeHash(Encoding.Unicode.GetBytes(ivStr))
Dim fStream As New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim cStream As New CryptoStream(fStream, rijn.CreateDecryptor(Key, IV), CryptoStreamMode.Read)
Dim sReader As New StreamReader(cStream)
Dim ftxt As String = sReader.ReadToEnd
Dim bytes() As Byte = Encoding.Unicode.GetBytes(ftxt)
Dim mStream As New MemoryStream(bytes)
Dim result As Object = formatter.Deserialize(mStream)
sReader.Close()
cStream.Close()
fStream.Close()
mStream.Close()
Return result
End Function
加密:
CryptographyStream(Application.StartupPath & "\ProcessInfo\3.info", " 中 国~!@#$%^&*()_+|<>?{}[]=\人民解放军ABCabc123")
解密:
Debug.Write(ProcessInfo.DecodeStream(Application.StartupPath & "\ProcessInfo\3.info").ToString)
加密字符串改成:中国人民解放军abcd1234可以正常解密,但像上面那样的字符串出现:二进制流“253”不包含有效的binaryheader,这可是由于无效流,或由于在序列化和反序列化之间的对象版本更改。
什么原因,如何解决?
------解决方案--------------------
加密后得到的二进制流直接写入文件就可以了,
再Encoding.Unicode.GetChars(mStream.ToArray())是不对的