当前位置: 代码迷 >> VB Dotnet >> 在网上找的两段加密代码,解密时出错,请帮忙看一下怎么解决
  详细解决方案

在网上找的两段加密代码,解密时出错,请帮忙看一下怎么解决

热度:330   发布时间:2016-04-25 02:23:12.0
在网上找的两段加密代码,解密时出错,请帮忙看一下如何解决?
   
 ''' <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())是不对的
  相关解决方案