2012-01-27 7 views
0

私は以下のクラスコードと同じロジックを使用していますが、ファイルを解読するときにディスクに解読し、暗号化されたバージョンを削除するかどうかを指定します。ファイルをメモリに解読してファイルをバイト()としてキャプチャし、そのバイトをサービスに送るオプションを追加しようとしています。私は明らかにファイルをディスクに解読し、ファイルストリームを読んだり、バイト()に変換したり、解読されたバージョンを削除したりすることができます(ファイルを暗号化しておく必要があります)とりわけ、ディスクの断片化を引き起こす可能性があります。そのため、ファイルを復号化してメモリに保存したいと考えています。とにかく、これは正常にmemorystream変数にファイルを復号化しますが、ファイルビューアにバイトをダンブルすると、ファイル形式が認識されないことがわかります。誰も私がここで間違っていることを知っていますか?Rijndael管理されたCryptostreamがディスクからメモリにファイルを解読する

Public Class EncryptionFactory  

Private Shared fsInput As FileStream 

      Public Shared Function GetDecryptedFile(ByVal password As String, ByVal encryptedFilePath As String) As Byte() 

       Return DecryptFile(encryptedFilePath, Key(password), IV(password)) 

      End Function 


      Private Shared Function DecryptFile(ByVal strInputFile As String, ByVal bytKey As Byte(), ByVal bytIV As Byte()) As Byte() 

       fsInput = New FileStream(strInputFile, FileMode.Open, FileAccess.Read) 
       Dim memoryStream As MemoryStream 
       memoryStream = New MemoryStream() 
       Dim array As Byte() = New Byte(&H1001 - 1) {} 
       Dim num2 As Long = 0 
       Dim length As Long = fsInput.Length 
       Dim managed As New RijndaelManaged 
       Dim stream As New CryptoStream(memoryStream, managed.CreateDecryptor(bytKey, bytIV), CryptoStreamMode.Write) 

       Do While (num2 < length) 
        Dim count As Integer = fsInput.Read(array, 0, &H1000) 
        stream.Write(array, 0, count) 
        num2 = (num2 + count) 
       Loop 

       Dim data As Byte() = memoryStream.ToByte() 

       fsInput.Close() 
       fsInput.Dispose() 
       memoryStream.Close() 
       memoryStream.Dispose() 

       Return data 

      End Function 

      Private Shared Function Key(ByVal strPassword As String) As Byte() 
       Dim num5 As Integer 
       Dim chArray As Char() = strPassword.ToCharArray 
       Dim buffer As Byte() = New Byte((chArray.GetUpperBound(0) + 1) - 1) {} 
       Dim upperBound As Integer = chArray.GetUpperBound(0) 
       Dim i As Integer = 0 
       Do While (i <= upperBound) 
        buffer(i) = CByte(Strings.Asc(chArray(i))) 
        i += 1 
       Loop 
       Dim buffer3 As Byte() = New SHA512Managed().ComputeHash(buffer) 
       Dim buffer2 As Byte() = New Byte(&H20 - 1) {} 
       Dim index As Integer = 0 
       Do 
        buffer2(index) = buffer3(index) 
        index += 1 
        num5 = &H1F 
       Loop While (index <= num5) 
       Return buffer2 
      End Function 

      Private Shared Function IV(ByVal strPassword As String) As Byte() 
       Dim num5 As Integer 
       Dim chArray As Char() = strPassword.ToCharArray 
       Dim buffer As Byte() = New Byte((chArray.GetUpperBound(0) + 1) - 1) {} 
       Dim upperBound As Integer = chArray.GetUpperBound(0) 
       Dim i As Integer = 0 
       Do While (i <= upperBound) 
        buffer(i) = CByte(Strings.Asc(chArray(i))) 
        i += 1 
       Loop 
       Dim buffer3 As Byte() = New SHA512Managed().ComputeHash(buffer) 
       Dim buffer2 As Byte() = New Byte(&H10 - 1) {} 
       Dim index As Integer = &H20 
       Do 
        buffer2((index - &H20)) = buffer3(index) 
        index += 1 
        num5 = &H2F 
       Loop While (index <= num5) 
       Return buffer2 
      End Function 



     End Class 

UPDATE:私はこれはまだ動作していないcryptostream.FlushFinalBlock()

を追加

が...私はそれのように感じるだけだ。ここ

は、私がこれまで持っているコードですストリームを最後まで読んでいない。

Private Shared Function DecryptFile(ByVal strInputFile As String, ByVal bytKey As Byte(), ByVal bytIV As Byte()) As Byte() 

    fsInput = New FileStream(strInputFile, FileMode.Open, FileAccess.Read) 
    Dim memoryStream As MemoryStream 
    memoryStream = New MemoryStream() 
    Dim array As Byte() = New Byte(&H1001 - 1) {} 
    Dim num2 As Long = 0 
    Dim length As Long = fsInput.Length 
    Dim managed As New RijndaelManaged 
    Dim stream As New CryptoStream(memoryStream, managed.CreateDecryptor(bytKey, bytIV), CryptoStreamMode.Write) 

    Do While (num2 < length) 
     Dim count As Integer = fsInput.Read(array, 0, &H1000) 
     stream.Write(array, 0, count) 
     num2 = (num2 + count) 
    Loop 

    stream.FlushFinalBlock() 

    Dim data As Byte() = memoryStream.ToByte() 

    fsInput.Close() 
    fsInput.Dispose() 
    memoryStream.Close() 
    memoryStream.Dispose() 

    Return data 

End Function 

UPDATE:

はここで同じIVを使用して、私の "暗号化" の方法でだ、と復号化などの主要な方法...

Friend Sub EncryptFile(ByVal strInputFile As String, ByVal strOutputFile As String, ByVal bytKey As Byte(), ByVal bytIV As Byte(), ByVal deleteOrig As Boolean) 
    Me.fsInput = New FileStream(strInputFile, FileMode.Open, FileAccess.Read) 
    Me.fsOutput = New FileStream(strOutputFile, FileMode.OpenOrCreate, FileAccess.Write) 
    Me.fsOutput.SetLength(0) 
    Dim array As Byte() = New Byte(&H1001 - 1) {} 
    Dim num2 As Long = 0 
    Dim length As Long = Me.fsInput.Length 
    Dim managed As New RijndaelManaged 
    Dim stream As New CryptoStream(Me.fsOutput, managed.CreateEncryptor(bytKey, bytIV), CryptoStreamMode.Write) 
    Do While (num2 < length) 
     Dim count As Integer = Me.fsInput.Read(array, 0, &H1000) 
     stream.Write(array, 0, count) 
     num2 = (num2 + count) 
    Loop 
    stream.Close 
    Me.fsInput.Close 
    Me.fsOutput.Close 
    If deleteOrig Then 
     Dim info As New FileInfo(strInputFile) 
     If ((info.Attributes And FileAttributes.ReadOnly) > 0) Then 
      info.Attributes = (info.Attributes Xor FileAttributes.ReadOnly) 
      File.Delete(strInputFile) 
     Else 
      info.Delete 
     End If 
    End If 
End Sub 

決勝UPDATE:

がここにあります復号化されたファイルをメモリコードに変換します。

Private Shared Function DecryptFile(ByVal strInputFile As String, ByVal bytKey As Byte(), ByVal bytIV As Byte()) As Byte() 

     fsInput = New FileStream(strInputFile, FileMode.Open, FileAccess.Read) 
     Dim memoryStream As MemoryStream 
     memoryStream = New MemoryStream() 
     Dim array As Byte() = New Byte(&H1001 - 1) {} 
     Dim num2 As Long = 0 
     Dim length As Long = fsInput.Length 
     Dim managed As New RijndaelManaged 
     Dim stream As New CryptoStream(memoryStream, managed.CreateDecryptor(bytKey, bytIV), CryptoStreamMode.Write) 

     Do While (num2 < length) 
      Dim count As Integer = fsInput.Read(array, 0, &H1000) 
      stream.Write(array, 0, count) 
      num2 = (num2 + count) 
     Loop 

     stream.FlushFinalBlock() 
     stream.Dispose() 

     Dim data As Byte() = memoryStream.ToArray() 

     fsInput.Close() 
     fsInput.Dispose() 
     memoryStream.Close() 
     memoryStream.Dispose() 

     Return data 

    End Function 

答えて

1

すべてのブロックの書き込みが完了したら、cryptoStream.FlushFinalBlock();を呼び出す必要があります。オフトピック

: ここでは

private void SetAlgorithmKey(SymmetricAlgorithm algorithm, string password, string salt, int iterationCount) 
{ 
    byte[] saltBytes = string.IsNullOrEmpty(salt) ? new byte[0] : Encoding.ASCII.GetBytes(salt); 

    // The salt size must be 8 bytes or larger. 
    if (saltBytes.Length < 8) 
    { 
     byte[] newSaltBytes = new byte[8]; 
     Array.Copy(saltBytes, newSaltBytes, saltBytes.Length); 
     for (int i = saltBytes.Length; i < 8; i++) 
     { 
      newSaltBytes[i] = 0; // pad with zeros? 
     } 

     saltBytes = newSaltBytes; 
    } 

    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, saltBytes, iterationCount); 
    algorithm.Key = pdb.GetBytes(algorithm.KeySize/8); 
    algorithm.IV = pdb.GetBytes(algorithm.BlockSize/8); 
} 
+0

私の更新を参照してください、あなたのアルゴリズムのための鍵とIVを取得するために使用する例です...私はあなたが提案し何をしようとした、と私は取得しています同じ結果...提案を間違って実装しましたか? – wakurth

+0

.NET 4の場合は、ループの代わりに 'fsInput.CopyTo(stream);'を使うことができます。ファイルを暗号化すると、 'FlushFinalBlock'が呼ばれましたか? –

+0

また、キーコードとIVコードがどこから得られたのかよくわかりません。 'System.Security.Cryptography.Rfc2898DeriveBytes'を使ったほうが良い方法があります –

関連する問題