2013-02-03 43 views
2

我已经在vb.net写了一个类来加密/解密文件,但是当我解密文件如图片或拉链或办公文件,它们看起来损坏。但是,如果我打开记事本中的解密和原始文件,他们是完全一样的。我能做些什么来阻止呢?DES文件加密文件腐败

Imports System 
Imports System.IO 
Imports System.Security 
Imports System.Security.Cryptography 
Imports System.Text 

Public Class Encrytion 
Shared Sub EncryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String) 

    Dim fsInput As New FileStream(sInputFilename, _ 
           FileMode.Open, FileAccess.Read) 
    Dim fsEncrypted As New FileStream(sOutputFilename, _ 
           FileMode.Create, FileAccess.Write) 

    Dim DES As New DESCryptoServiceProvider() 

    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey) 

    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey) 

    Dim desencrypt As ICryptoTransform = DES.CreateEncryptor() 

    Dim cryptostream As New CryptoStream(fsEncrypted, _ 
             desencrypt, _ 
             CryptoStreamMode.Write) 


    Dim bytearrayinput(fsInput.Length - 1) As Byte 
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length) 

    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length) 
    cryptostream.Close() 
End Sub 

Shared Sub DecryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String) 

    Dim DES As New DESCryptoServiceProvider() 

    DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey) 

    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey) 

    Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read) 

    Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor() 

    Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read) 

    Dim fsDecrypted As New StreamWriter(sOutputFilename) 
    fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd) 
    fsDecrypted.Flush() 
    fsDecrypted.Close() 
End Sub 

End Class 
+3

'但是,如果我在记事本中打开解密和加密的文件,他们是完全same.' - 如何可能吗? –

+0

首先想到的:记得设置文件后缀到其先前的后缀。即.txt .zip。无论如何。 – WozzeC

+0

@WozzeC我总是设置文件后缀回到原来的一个 – kasperB

回答

1

我发现this answer来解决这个问题。总之,加密和解密功能应该是完全一样的,CreateEncryptor/CreateDecryptor通话之外:

Shared Sub EncryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String) 

    Dim fsInput As New FileStream(sInputFilename, _ 
           FileMode.Open, FileAccess.Read) 
    Dim fsEncrypted As New FileStream(sOutputFilename, _ 
           FileMode.Create, FileAccess.Write) 

    Dim DES As New DESCryptoServiceProvider() 

    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey) 

    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey) 

    Dim desencrypt As ICryptoTransform = DES.CreateEncryptor(DES.Key, DES.IV) 

    Dim cryptostream As New CryptoStream(fsEncrypted, _ 
             desencrypt, _ 
             CryptoStreamMode.Write) 


    Dim bytearrayinput(fsInput.Length - 1) As Byte 
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length) 

    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length) 
    cryptostream.Flush() 

    cryptostream.Close() 
End Sub 

Shared Sub DecryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String) 
    Dim fsInput As New FileStream(sInputFilename, _ 
         FileMode.Open, FileAccess.Read) 
    Dim fsEncrypted As New FileStream(sOutputFilename, _ 
           FileMode.Create, FileAccess.Write) 

    Dim DES As New DESCryptoServiceProvider() 

    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey) 

    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey) 

    Dim desencrypt As ICryptoTransform = DES.CreateDecryptor(DES.Key, DES.IV) 

    Dim cryptostream As New CryptoStream(fsEncrypted, _ 
             desencrypt, _ 
             CryptoStreamMode.Write) 


    Dim bytearrayinput(fsInput.Length - 1) As Byte 
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length) 

    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length) 
    cryptostream.Flush() 

    cryptostream.Close() 
End Sub 
+1

谢谢!这最终修复了它 – kasperB