2012-06-15 7 views
5

Hi ive cercato di usare System.Security.Cryptography per cifrare e decifrare un file, ma non il suo lavoro per meCrittografia in VB.net - il file decrittografato è più grande del file sorgente?

questo codice

Private 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 

chiamato con

EncryptFile(OpenFileDialog1.FileName, SaveFileDialog1.FileName, "12345678")[/CODE] 

sembra funzionare ok e ottengo un file delle stesse dimensioni del file sorgente

heres dove va male però

questo codice

Private 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 

chiamato con

DecryptFile(OpenFileDialog1.FileName, SaveFileDialog1.FileName, "12345678")[/CODE] 

emette un file che è quasi 2 volte grande come il file di origine che è stato crittografato.

cosa sta succedendo sono sicuro che questo stava funzionando bene poche settimane fa e non posso vedere nulla di chiaramente sbagliato con esso.

qualche idea per favore?

+0

L'uso di StreamReader/Writer non è appropriato, non è stato utilizzato durante la lettura del file originale. –

risposta

3

Il problema principale è che EncryptFile legge i dati utilizzando un array di byte e DecryptFile sta leggendo nei dati utilizzando i flussi. L'unica differenza tra i metodi EncryptFile e DecryptFile dovrebbe essere il tuo compito ICryptoTransform. Sarebbe più facile avere il codice comune in 1 procedura:

Private Sub EncryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String) 
    Crypto(sInputFilename, sOutputFilename, sKey, True) 
End Sub 

Private Sub DecryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String) 
    Crypto(sInputFilename, sOutputFilename, sKey, False) 
End Sub 

Private Sub Crypto(ByVal sInputFileName As String, ByVal sOutputFileName As String, ByVal sKey As String, ByVal bEncrypt As Boolean) 
    'Define the service provider 
    Dim DES As New DESCryptoServiceProvider() 
    DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey) 
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey) 


    'Read the input file into array 
    Dim fsInput As New FileStream(sInputFileName, FileMode.Open, FileAccess.Read) 
    Dim bytearrayinput(fsInput.Length - 1) As Byte 
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length) 


    'Define the crypto transformer 
    Dim cryptoTransform As ICryptoTransform 

    If bEncrypt Then 
     cryptoTransform = DES.CreateEncryptor() 
    Else 
     cryptoTransform = DES.CreateDecryptor 
    End If 


    'Create the encrypting streams 
    Dim fsEncrypted As New FileStream(sOutputFileName, FileMode.Create, FileAccess.Write) 
    Dim cryptostream As New CryptoStream(fsEncrypted, cryptoTransform, CryptoStreamMode.Write) 

    'Write the output file 
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length) 
    cryptostream.Close() 
End Sub 

procedura La crittografia è quasi identico a quello EncryptFile usato. La differenza è che cambio l'assegnazione ICryptoTransform in base alla crittografia o alla decrittografia.

+1

grazie per la spiegazione. funziona bene ora. grazie per il tuo sub :) – user1459286

Problemi correlati