Verschlüsselung einer Datei über ihre Bytes

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Verschlüsselung einer Datei über ihre Bytes

    Hallo liebe Community,

    wieder einmal habe ich wohl einen Denkfehler..
    Ich habe mich Gestern mit der Ver- und Entschlüsslung von Strings beschafft und auch eine, wie ich behaupten kann, recht gute hinbekommen.

    Nun will ich einen Schritt weiter gehen und will Probieren eine einfache .PHP File zu verschlüsseln.
    dabei will ich die Bytes mit meinem Modifizierten Vernam-Algorythmus verändern und wieder als datei schreiben.

    Nun bin ich allerdings nur bis zum io.file.readallbytes(file) gekommen und weiß grad nicht wie ich das ganze weiter verarbeiten kann...
    Ich habe mir eine Lib erstellt, die ich dann in mein Testprojekt eingebunden habe.
    Verschlüsseln der File funktioniert soweit schonmal.

    Aufruf der Funktion im Testprojekt

    VB.NET-Quellcode

    1. Function get_bytes()
    2. klartext = IO.File.ReadAllBytes(file)
    3. TextBox1.Text = System.Text.Encoding.Unicode.GetString(klartext)
    4. Return Nothing
    5. End Function
    6. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    7. Dim ofd As New OpenFileDialog
    8. ofd.DefaultExt = My.Computer.FileSystem.SpecialDirectories.Desktop
    9. If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
    10. file = ofd.FileName
    11. get_bytes()
    12. vernam.startencript_file(klartext, file)
    13. End If
    14. End Sub



    Und einmal der Teil aus der Lib

    VB.NET-Quellcode

    1. Function VernamCode_file(ByVal sOriginal As String, ByVal sPassword As String)
    2. Dim i As Long
    3. Dim aktpos As Long
    4. Dim bAkt As Byte
    5. Dim bCode As Byte
    6. VernamCode_file = ""
    7. aktpos = 1
    8. For i = Len(sPassword) + 1 To Len(sOriginal)
    9. sPassword = sPassword & Mid(sPassword, aktpos, 1)
    10. aktpos = aktpos + 1
    11. If aktpos > Len(sPassword) Then aktpos = 1
    12. Next i
    13. For i = 1 To Len(sOriginal)
    14. bAkt = Asc(Mid(sOriginal, i, 1))
    15. bCode = Asc(Mid(sPassword, i, 1))
    16. VernamCode_file = VernamCode_file & Chr(bAkt Xor bCode)
    17. Next i
    18. End Function
    19. Function startencript_file(ByVal original() As Byte, ByVal filename As String)
    20. Dim randompw As String = "a"
    21. If Not IO.File.Exists(pfile) Then
    22. Dim random As New Random
    23. Dim Allowed As String() = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "!", "§", "$", "%", "&", "/", "\", "(", ")", "=", "]", "[", "}", "{", "-", ",", ".", "_", "#", "*"}
    24. For i As Integer = 0 To 10000
    25. randompw = Mid(randompw & Allowed(random.Next(0, Allowed.Length)), 1)
    26. Next
    27. Dim writer As New IO.StreamWriter(pfile)
    28. writer.WriteLine(randompw.Length & "||" & randompw)
    29. writer.Close()
    30. Else
    31. Dim reader As New IO.StreamReader(pfile)
    32. Dim parts() As String = Split(reader.ReadLine, "||")
    33. reader.Close()
    34. randompw = parts(1)
    35. End If
    36. Dim klar As String = System.Text.Encoding.Unicode.GetString(original)
    37. Dim newfile() As Byte = System.Text.Encoding.Unicode.GetBytes(VernamCode_string(klar, randompw))
    38. IO.File.WriteAllBytes(filename, newfile)
    39. MsgBox(filename & " verschlüsselt gespeichert... Erfolgreich", MsgBoxStyle.Information, "Erfolg")
    40. Return Nothing
    41. End Function
    42. Function startdecript_file(ByVal original() As Byte, ByVal filename As String)
    43. Dim randompw As String
    44. Dim reader As New IO.StreamReader(pfile)
    45. Dim crypted() As Byte
    46. Dim parts() As String = Split(reader.ReadLine, "||")
    47. randompw = parts(1)
    48. reader.Close()
    49. crypted = IO.File.ReadAllBytes(filename)
    50. Dim crypted_as_string As String = System.Text.Encoding.Unicode.GetString(original)
    51. Dim encrypted As String = VernamCode_file(crypted_as_string, randompw)
    52. encrypted = encrypted.Substring(0, encrypted.Length - 2)
    53. IO.File.WriteAllBytes(filename, System.Text.Encoding.Unicode.GetBytes(encrypted))
    54. Return Nothing
    55. End Function


    Das Verschlüsseln von einem String Funktioniert auf diese Variante wunderbar. Entschlüsseln geht natürlich auch wunderbar:)
    Jetzt habe ich hier zur schnellen Erklärung:

    Die Datei mit Readallbytes eingelesen, in einen String umgewandelt und verschlüsseln lassen. Danach habe ich das ganze wieder zurück in Bytes konvertiert und mit WriteAllBytes schreiben lassen.
    Die Datei (zum Test ein Bild) lässt sich danach wie geplant nicht mehr öffnen
    Führe ich nun allerdings die Decrypt Funktion aus, verschlüsselt er es allerdings noch mehr oO"

    Denkfehler?
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

    Linkai schrieb:

    in einen String umgewandelt
    ist da eher suboptimal.
    Wenn Du Bytes eingelesen hast, arbeite auch mit Bytes!
    Teste das ganze an einem kurzen ByteArray, das Du zufällig generierst, hin und zurück.
    Wenn das läuft, geh auf Dateien.
    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!
    erstmal danke für die kompakte Antwort...

    Ich hab grad nur kein plan wie ich das am besten umsetzen kann..
    Ich will meine verschlüsslungsmethode ja eigentlich beibehalten mit dem Vernam.

    Kann ich

    VB.NET-Quellcode

    1. For i = 1 To Len(sOriginal)
    2. bAkt = Asc(Mid(sOriginal, i, 1))
    3. bCode = Asc(Mid(sPassword, i, 1))
    4. VernamCode_file = VernamCode_file & Chr(bAkt Xor bCode)
    5. Next i


    ersetzen durch:

    VB.NET-Quellcode

    1. For i = 1 To bytearray.count
    2. bAkt = Asc(Mid(aktbyte, i, 1))
    3. bCode = Asc(Mid(sPassword, i, 1))
    4. VernamCode_file = VernamCode_file & Chr(bAkt Xor bCode)
    5. Next i


    -.-" X( .. bei mir steht grad alles :D
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Da gibts regelmäßig große Symposien vom Chaos ComputerClub zum Thema Kryptografie.
    Und ungefähr das einzige, was die Redner da reden ist: Versuche nicht, das Rad neu zu erfinden. Jede selbstgebastelte Verschlüsselung ist ein Scheunentor-Sicherheitsloch.

    Bau lieber auf bekannte Algorithmen nach dem Stand der Technik, deren Sicherheit mathematisch nachgewiesen und quantifiziert ist.
    zb nach stand der Technik gibt man sich mittm Verschlüsseln von speziell Strings gar nicht ab.
    Verschlüsseln und Autentifizieren

    Linkai schrieb:

    verschlüsslungsmethode ja eigentlich beibehalten
    Arbeite auf dem Datentyp Byte. Das bedeutet, dass in Deinem Code Asc und Mid nicht vorkommen.
    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!
    Dies knallt allerdings:

    Eierlein schrieb:

    VB.NET-Quellcode

    1. For i = 1 To bytearray.count

    @Linkai .NET ist null-basiert.

    VB.NET-Quellcode

    1. For i = 0 To bytearray.count - 1

    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!