Datei stückenweise einlesen und verschlüsseln

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von TheKing4241.

    Datei stückenweise einlesen und verschlüsseln

    Hallo Forum,

    ich habe eine Klasse um Bytes mit AES zu
    verschlüsseln und habe mir auch einen Code zum Einlesen einer Datei
    zusammengebastelt, doch jetzt habe ich Probleme beim Schreiben der
    verschlüsselten Bytes, da diese ja größer sind als die eingelesenen.

    Code zum Einlesen:

    VB.NET-Quellcode

    1. Private Sub Encrypt(ByVal file As String, ByVal pwd As String, ByVal keysize As Integer)
    2. Dim fileread As New IO.FileStream(file, FileMode.Open, FileAccess.Read)
    3. Dim filewrite As New IO.FileStream(file & ".aes", FileMode.Create, FileAccess.Write)
    4. Dim buffer(1024 - 1) As Byte
    5. Do While True
    6. Dim bytesRead As Integer = fileread.Read(buffer, 0, buffer.Length)
    7. If bytesRead = 0 Then Exit Do
    8. Dim bcrypt() As Byte = AES.Encrypt(keysize, buffer, pwd)
    9. filewrite.Write(bcrypt, 0, bytesRead) '<-- bytesRead geht nicht,
    10. 'da die verschl. Bytes größer sind
    11. filewrite.Flush()
    12. Loop
    13. fileread.Dispose()
    14. filewrite.Dispose()
    15. fileread.Close()
    16. filewrite.Close()
    17. End Sub


    Nun frage ich mich, wie man das lösen könnte und ob dieser Code überhaupt richtig ist oder es überhaupt so funktionieren kann.
    Ich würde ich über jede Antwort freuen :D
    Du kannst die "Count"-Property des neuen Array abrufen und hinten eintragen. Noch was: Du kannst das While True rausnehmen.
    Das ist mein Code zum Verschlüsseln in AES:

    VB.NET-Quellcode

    1. Imports System.Security.Cryptography
    2. Public Class AES
    3. Public Shared Function Encrypt(ByVal KeySize As Int32, ByVal DecryptedText As String, ByVal password As String, Optional ByVal saltstring As String = "Lm5=}7PeBd4?2X+g{oF3J&9z1n*R!Gb68f/C$6Es3y-KZ1c_7%HtD5q*}aN24=jY")
    4. Dim salt() As Byte = System.Text.Encoding.UTF8.GetBytes(saltstring)
    5. Dim key As New Rfc2898DeriveBytes(password, salt)
    6. Dim AES As New AesCryptoServiceProvider
    7. AES.KeySize = KeySize
    8. AES.BlockSize = 128
    9. AES.Key = key.GetBytes(AES.KeySize \ 8)
    10. AES.IV = key.GetBytes(AES.BlockSize \ 8)
    11. Dim ms As New IO.MemoryStream
    12. Dim cs As New CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)
    13. Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(DecryptedText)
    14. cs.Write(data, 0, data.Length)
    15. cs.FlushFinalBlock()
    16. cs.Close()
    17. Dim final() As Byte = ms.ToArray
    18. ms.Close()
    19. AES.Clear()
    20. Return Convert.ToBase64String(final)
    21. End Function
    22. Public Shared Function Decrypt(ByVal KeySize As Int32, ByVal EncryptedText As String, ByVal password As String, Optional ByVal saltstring As String = "Lm5=}7PeBd4?2X+g{oF3J&9z1n*R!Gb68f/C$6Es3y-KZ1c_7%HtD5q*}aN24=jY")
    23. Dim salt() As Byte = System.Text.Encoding.UTF8.GetBytes(saltstring)
    24. Dim key As New Rfc2898DeriveBytes(password, salt)
    25. Dim AES As New AesCryptoServiceProvider
    26. AES.KeySize = KeySize
    27. AES.BlockSize = 128
    28. AES.Key = key.GetBytes(AES.KeySize \ 8)
    29. AES.IV = key.GetBytes(AES.BlockSize \ 8)
    30. Dim ms As New IO.MemoryStream
    31. Dim cs As New CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)
    32. Try
    33. Dim data() As Byte = Convert.FromBase64String(EncryptedText)
    34. cs.Write(data, 0, data.Length)
    35. cs.FlushFinalBlock()
    36. cs.Close()
    37. Dim final() As Byte = ms.ToArray
    38. ms.Close()
    39. AES.Clear()
    40. Return System.Text.Encoding.UTF8.GetString(final)
    41. Catch ex As Exception
    42. Throw New Exception(ex.ToString)
    43. End Try
    44. End Function
    45. Public Shared Function Encrypt(ByVal KeySize As Int32, ByVal input() As Byte, ByVal password As String, Optional ByVal saltstring As String = "Lm5=}7PeBd4?2X+g{oF3J&9z1n*R!Gb68f/C$6Es3y-KZ1c_7%HtD5q*}aN24=jY")
    46. Dim salt() As Byte = System.Text.Encoding.UTF8.GetBytes(saltstring)
    47. Dim key As New Rfc2898DeriveBytes(password, salt)
    48. Dim AES As New AesManaged
    49. AES.KeySize = KeySize
    50. AES.BlockSize = 128
    51. AES.Key = key.GetBytes(AES.KeySize \ 8)
    52. AES.IV = key.GetBytes(AES.BlockSize \ 8)
    53. Dim ms As New IO.MemoryStream
    54. Dim cs As New CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)
    55. Dim data() As Byte = input
    56. cs.Write(data, 0, data.Length)
    57. cs.FlushFinalBlock()
    58. cs.Close()
    59. Dim final() As Byte = ms.ToArray
    60. ms.Close()
    61. AES.Clear()
    62. Return final
    63. End Function
    64. Public Shared Function Decrypt(ByVal KeySize As Int32, ByVal input() As Byte, ByVal password As String, Optional ByVal saltstring As String = "Lm5=}7PeBd4?2X+g{oF3J&9z1n*R!Gb68f/C$6Es3y-KZ1c_7%HtD5q*}aN24=jY")
    65. Dim salt() As Byte = System.Text.Encoding.UTF8.GetBytes(saltstring)
    66. Dim key As New Rfc2898DeriveBytes(password, salt)
    67. Dim AES As New AesManaged
    68. AES.KeySize = KeySize
    69. AES.BlockSize = 128
    70. AES.Key = key.GetBytes(AES.KeySize \ 8)
    71. AES.IV = key.GetBytes(AES.BlockSize \ 8)
    72. Dim ms As New IO.MemoryStream
    73. Dim cs As New CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)
    74. Try
    75. Dim data() As Byte = input
    76. cs.Write(data, 0, data.Length)
    77. cs.FlushFinalBlock()
    78. cs.Close()
    79. Dim final() As Byte = ms.ToArray
    80. ms.Close()
    81. AES.Clear()
    82. Return final
    83. Catch ex As Exception
    84. Throw New Exception(ex.ToString)
    85. End Try
    86. End Function
    87. End Class
    So funktioniert das natürlich nicht. Du musst alles in einem Rutsch verschlüsseln, ansonsten werden alle Byte-Pakete einzeln verschlüsselt und können dementsprechend auch nur einzeln entschlüsselt werden. Der Weg ist hier, wie ErfinderDesRades bereits sagte, ein CryptoStream.