Entschlüsselung von dateien klappt nicht (AES)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ChOoSeMyNaMe.

    Entschlüsselung von dateien klappt nicht (AES)

    Hallo zusammen,

    ich kann seit Tagen folgendes Problem nicht eruieren. Wenn ich mittels AES eine Datei verschlüssele funktioniert es. Möchte ich diese dann entschlüsseln, funktioniert es auch nur kann ich die datei dann nicht öffnen, da viele Zeichen nicht richtig dargestellt werden.
    Hier ein kleines Beipiel:
    Anfang der Datei: Original

    Quellcode

    1. ‰PNG
    2. IHDR € € L\öœ éIDATxÚí]{TUE¿R‚

    Nach Ver- und Entschlüsselung:

    Quellcode

    1. �PNG
    2. IHDR � � L\�� �IDATx��]{TUE�R�


    Hier der relevante Teil meines Codes

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim ItemCount As Integer
    3. Try
    4. For Each Item In ListBox41.Items
    5. Dim NewFile As String
    6. ItemCount += 1
    7. NewFile = ListBox41.Items.Item(ItemCount - 1).ToString
    8. Dim s As String = File.ReadAllText(NewFile)
    9. Dim hexNumbers As String
    10. Dim Ran As String
    11. Dim Pass As String
    12. Dim PassPor As String
    13. 'Ran = Push(True)
    14. Ran = PushTest(True)
    15. PassPor = HowOftRan(True, Ran)
    16. Pass = HowOftRanPass(True, Ran)
    17. hexNumbers = EncodePoriaXo(True, s, Pass, PassPor)
    18. Dim strNew As New System.IO.StreamWriter(Path.ChangeExtension(ListBox41.Items.Item(ItemCount - 1).ToString, "sktl"), True)
    19. strNew.Write(hexNumbers)
    20. strNew.Close()
    21. Kill(ListBox41.Items.Item(ItemCount - 1).ToString)
    22. MsgBox("Ordner wurde verschlüsselt!")
    23. Next
    24. Catch ex As Exception
    25. MsgBox("Bitte leeren Sie die Liste und ziehen den zu verschlüsselnden Ordner erneut!")
    26. End Try
    27. End Sub
    28. Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
    29. Dim ItemCount As Integer
    30. Try
    31. For Each Item In ListBox41.Items
    32. Dim NewFile As String
    33. ItemCount += 1
    34. NewFile = ListBox41.Items.Item(ItemCount - 1).ToString
    35. Dim Decode As String
    36. Dim so As String = File.ReadAllText(NewFile)
    37. Dim Ran As String
    38. Dim Pass As String
    39. Dim PassPor As String
    40. 'Ran = Push(True)
    41. Ran = PushTest(True)
    42. PassPor = HowOftRan(True, Ran)
    43. Pass = HowOftRanPass(True, Ran)
    44. Decode = DecodePoriaXo(True, so, Pass, PassPor)
    45. Dim strNew As New System.IO.StreamWriter(Path.ChangeExtension(ListBox41.Items.Item(ItemCount - 1).ToString, "png"), True)
    46. strNew.Write(Decode)
    47. strNew.Close()
    48. Kill(ListBox41.Items.Item(ItemCount - 1).ToString)
    49. MsgBox("Ordner wurde entschlüsselt!")
    50. Next
    51. Catch ex As Exception
    52. MsgBox("Bitte leeren Sie die Liste und ziehen den zu entschlüsselnden Ordner erneut!")
    53. End Try
    54. End Sub


    Vielen Dank im Voraus für Eure Unterstützung ;) :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „wasserbaum“ ()

    wasserbaum schrieb:

    relevante Teil
    Was muss ich tun, um den Fehler zu reproduzieren?
    Was steht in ListBox41 drin?
    Was ist

    VB.NET-Quellcode

    1. Ran = PushTest(True)
    2. PassPor = HowOftRan(True, Ran)
    3. Pass = HowOftRanPass(True, Ran)
    4. hexNumbers = EncodePoriaXo(True, s, Pass, PassPor)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany,

    danke für Deine schnelle Reaktion ;)

    zu Deiner Frage: In ListBox41 steht der Pfad.

    Ran, Pass und PassPor sind nur Funktionen die einen String herausgeben. Dieser wird randomiziert (wenn man es so nennen kann) und dann erhält man von Ran = Randomnummer Bsp. 1234.
    Entsprechend dieser Nummer erhält z.B. PassPor = &($%/$%&/$95$%&# das entspricht den Saltwer und Pass = §Ef/&$6/&$//ZT( das entspricht dem Passwort.

    hexnumbers ist als String deklariert. EncodePoriaXo ist dann die AES Verschlüsselung.

    Quellcode

    1. EncodePoriaXo(True, "Der String der Ver oder Entschlüsselt wird", "Das Passwort", "Der Saltwert")

    Evtl. Sollte ich noch hinzufügen, dass diese alles Strings sind

    Danke und Gruß
    wasserbaum

    wasserbaum schrieb:

    die einen String herausgeben
    Poste mal alle Funktionen, die verwendet werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany,

    nachfolgend der relevante Teil:

    VB.NET-Quellcode

    1. Imports System.Security.Cryptography
    2. Public Class Class1
    3. Public Shared Function PushTest(ByVal OK As Boolean) As String
    4. 'Dim Randnr As Integer = CInt(Math.Ceiling(Rnd() * 9999)) + 1
    5. ' Für Testzwecke Randnr fest definiert mit PushTest
    6. PushTest = "1456"
    7. End Function
    8. Public Shared Function HowOftRan(ByVal OK As Boolean, ByVal Pushed As String) As String
    9. If Pushed = 1456 Then
    10. HowOftRan = "%3&%§&/%$3%$§&%35ws$"
    11. Else
    12. HowOftRan = "lKJ=)35ws$WhgcTR&%zed"
    13. End If
    14. End Function
    15. Public Shared Function HowOftRanPass(ByVal OK As Boolean, ByVal Pushed As String) As String
    16. If Pushed = 1456 Then
    17. HowOftRanPass = "&%$rG??(jCbm6T8%)"
    18. Else
    19. HowOftRanPass = "ws$WhgcTR&%zedD!"
    20. End If
    21. End Function
    22. Shared Function EncodePoriaXo(ByVal OK As Boolean,
    23. ByVal DecryptedString As String,
    24. ByVal PasswordCom As String, ByVal Saltpass As String) As String
    25. Dim AESKeySize As Int32 = 256
    26. Dim SaltZ As String
    27. Dim Password As String
    28. SaltZ = Saltpass
    29. Password = PasswordCom
    30. Dim Salt() As Byte
    31. Salt = System.Text.Encoding.UTF8.GetBytes(SaltZ)
    32. Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
    33. Dim AES As New AesManaged
    34. AES.KeySize = AESKeySize
    35. AES.BlockSize = 128
    36. AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
    37. AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
    38. Dim ms As New IO.MemoryStream
    39. Dim cs As New CryptoStream(ms, AES.CreateEncryptor(),
    40. CryptoStreamMode.Write)
    41. Dim Data() As Byte
    42. Data = System.Text.Encoding.UTF8.GetBytes(DecryptedString)
    43. cs.Write(Data, 0, Data.Length)
    44. cs.FlushFinalBlock()
    45. cs.Close()
    46. EncodePoriaXo = Convert.ToBase64String(ms.ToArray)
    47. ms.Close()
    48. AES.Clear()
    49. End Function
    50. ' Entschlüsseln
    51. Shared Function DecodePoriaXo(ByVal OK As Boolean, ByVal EncryptedString As String, ByVal PasswordCom As String, ByVal Saltpass As String) As String
    52. Dim AESKeySize As Int32 = 256
    53. Dim SaltZ As String
    54. Dim Password As String
    55. SaltZ = Saltpass
    56. Password = PasswordCom
    57. Dim Salt() As Byte
    58. Salt = System.Text.Encoding.UTF8.GetBytes(SaltZ)
    59. Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
    60. Dim AES As New AesManaged
    61. AES.KeySize = AESKeySize
    62. AES.BlockSize = 128
    63. AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
    64. AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
    65. Dim ms As New IO.MemoryStream
    66. Dim cs As New CryptoStream(ms, AES.CreateDecryptor(),
    67. CryptoStreamMode.Write)
    68. Try
    69. Dim Data() As Byte
    70. Data = Convert.FromBase64String(EncryptedString)
    71. cs.Write(Data, 0, Data.Length)
    72. cs.FlushFinalBlock()
    73. cs.Close()
    74. DecodePoriaXo = System.Text.Encoding.UTF8.GetString(ms.ToArray)
    75. ms.Close()
    76. AES.Clear()
    77. Catch ex As Exception
    78. DecodePoriaXo = "Ungültiges Passwort!"
    79. End Try
    80. End Function
    81. ReadOnly Property EncryptedString() As String
    82. Get
    83. ' Return EncryptedString_
    84. End Get
    85. End Property
    86. ReadOnly Property DecryptedString() As String
    87. Get
    88. ' Return DecryptedString_
    89. End Get
    90. End Property
    91. End Class
    Hallo 'ChOoSeMyNaMe'

    habe ich leider schon alles versucht. Ich erhalte letztendlich einen Text (Dateicode) der auf UTF8 kodiert it. Ändere ich diesen in VB so, das dieser als ANSI ausgegeben wird, erhalte ich um so mehr ????? Fragezeichen.

    Ich vermute auch, dass es an der Konvertierung liegt. Aber wo? ;)

    Ich mache ja folgendes:
    Beim Verschlüsseln

    VB.NET-Quellcode

    1. Data = System.Text.Encoding.UTF8.GetBytes(DecryptedString)
    2. EncodePoriaXo = Convert.ToBase64String(ms.ToArray)

    und beim Entschlüsseln

    VB.NET-Quellcode

    1. Data = Convert.FromBase64String(EncryptedString)
    2. DecodePoriaXo = System.Text.Encoding.UTF8.GetString(ms.ToArray)


    Vielen Dank Leute :)

    p.s. siehe screenshot


    Dateien haben aus Sicht der Verschlüsselung kein Encoding. Das sind alles nur Bytes. Sobald Du anfangst mit Strings zu hantieren, hast Du verloren. Wie AES grundsätzlich verwendet werden sollte hab ich hier schon mal gezeigt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils