Xor

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Moin,

    ich lese seit stunden etwas über Xor und es gibt ca 1000 Snippets zum verschlüsseln mit Xor.

    Meine Frage:

    Kann mir jemand mal vernünftig erklären was da passiert?

    Ich stelle mir das so vor:


    VB.NET-Quellcode

    1. Dim mystring As String = "EinString"
    2. Dim cryptstirng As String = "23423423423dfsdgdnlser3l42"
    3. Dim cryptedstring As String = mystring Xor cryptstring
    4. 'Kommt dann z.B. raus: sfsdfsdfsdg4235424zghwzh2zhfdfb
    5. ' und wenn ich jetzt
    6. mystring = cryptedstring Xor cryptstring
    7. 'mache sollte wieder
    8. ' "EinString" rauskommen.


    Ich verstehe nicht so recht wie das funktuioniert.
    Hilft mir jemand weiter?
    THX
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Hi.
    Verschlüsselungen soll man generell nicht selber machen. Man soll sich auf die gut getesteten und sicheren Verschlüsselungen verlassen, die das Framework bereitstellt (AES zum Beispiel). Wie man die verwendet ist hier erklärt: AES Verschlüsselung
    Verschlüsselungen arbeiten auch immer auf Bytes, nicht auf Strings. Falls Dir der Unterschied nicht klar ist: String to Hex

    Wenn Du diese XOR-Verschlüsselung mal zum Spielen basteln möchtest, dann ist das OK.
    Dass bei Dim cryptedstring As String = mystring Xor cryptstring nichts richtiges rauskommt, ist klar, denn der Xor-Operator arbeitet auf Zahlentypen und führt bitweise die XOR-Verknüpfung aus. Das hat mit Strings nichts zu tun. Falls der Code bei Dir übrigens kompiliert und einfach falsche Ergebnisse liefert: Visual Studio - Empfohlene Einstellungen
    Verlink mal die Erklärung für diese XOR-Verschlüsselung, von der Du am meisten verstehst. Stell dann konkrete Fragen hier im Forum, dann können wir Dir helfen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    msdn.microsoft.com/de-de/library/csw1x2a6.aspx

    Habe mir das direkt von microsoft genauer unter die Lupe genommen.

    Mir ist völlig klar dass z.B. aus

    0101 1001 mit dem key
    1010 1110
    1111 0111 wird. Habe nicht ganz nachvollziehen können wie ich sowas auf Strings anwende bis mir gerade klar geworden ist, dass es ja völlig einfach ist wenn ich einen string in bits verwandle. Habe nur krampfhaft nach einer für mich im ersten Moment "viel einfacheren" Möglichkeit gesucht.

    @RodFromGermany s Beitrag hat das dann direkt mal aufgeklärt wie eifnach das eigentlich ist.
    Fummel damit ein bisschen rum.

    Vielen Dank schonmal :)
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @RodFromGermany hat dir doch einen Link mit der kompletten Lösung. Ein kleines bisschen Anpassung wird aber trozdem benötigt.

    Versuchs mal so

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Text
    4. Public Module Module1
    5. Private Function Encrypt(ByVal b() As Byte, ByVal k() As Byte) As Byte()
    6. Return b.Select( ... ).ToArray 'Hier nur noch Anpassen
    7. End Function
    8. Private Function Decrypt(ByVal b() As Byte, ByVal k() As Byte) As Byte()
    9. Return b.Select( ... ).ToArray 'Hier nur noch Anpassen
    10. End Function
    11. Public Sub Main()
    12. Dim k As String = "Das ist mein Key"
    13. Dim s As String = "Das ist mein String"
    14. Dim bEnc() As Byte = Encrypt(Encoding.UTF8.GetBytes(s), Encoding.UTF8.GetBytes(k))
    15. Dim bRes() As Byte = Decrypt(bEnc, Encoding.UTF8.GetBytes(k))
    16. 'Kontrolle
    17. Dim res As String = Encoding.UTF8.GetString(bRes)
    18. Stop
    19. End Sub
    20. End Module


    Um numerische Strings in byte-Array umzuwandeln

    VB.NET-Quellcode

    1. Private Function makeArrayNum(ByVal s As String) As Byte()
    2. Return Encoding.UTF8.GetBytes(s).Select(Function(b) CByte(b - 48)).ToArray()
    3. End Function
    4. Private Function makeStringNum(ByVal b() As Byte) As String
    5. Return Encoding.UTF8.GetString(b.Select(Function(bb) CByte(bb + 48)).ToArray)
    6. End Function


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Hi
    das System basiert eben auf exklusivem Oder, die Tabelle wurde schon mal gezeigt (1 stehe bspw. für "wahr", 0 für "falsch"):
    0101
    0011
    ----
    0110
    In Worten: Das Ergebnis ist 1, wenn genau einer der Operanden 1 ist, sonst 0.
    Was in deiner Verschlüsselung passiert, ist vermutlich, dass der String erst in eine Byte-Darstellung gebracht wird und anschließend mit einem Schlüssel mit xor kombiniert wird. Nur derjenige, der den Schlüssel kennt, kann daraus den ursprünglichen Wert ableiten. Das stimmt aber nur dann, wenn der Schlüssel nur ein einziges Mal verwendet wird und nicht kürzer, als die Eingabe ist, sonst lassen sich zumindest Teile ggf. rückermitteln.
    Das Prinzip ist einfach: Wenn man zweimal Xor anwedet, erhält man das gleiche Ergebnis, wie am Anfang:
    (a xor b) xor b = a:
    0101
    0011
    0011
    ----
    0110
    0011
    ----
    0101
    Allerdings ist, wenn der Schlüssel unbekannt ist, auch jedes andere Ergebnis möglich. Die Schlüssel müssen halt auch irgendwie transportiert werden. Wird der Schlüssel wiederverwendet, lässt sich, je nach Art der Verwendung, ein Rückschluss auf die ursprünglichen Daten gewinnen. Bspw. ist in vielen Fällen die Wahrscheinlichkeit höher, dass Buchstaben, wie a, e, i, o, u, s, etc. verwendet werden. In anderen Fällen können bestimmte Zahlenmuster Rückschlüsse geben.
    Zufallszahlengeneratoren mit Seed sind übrigens keine sichere Methode, solche Schlüssel zu generieren, gleich mal vorweg. Aus den Ergebnissen eines Zufallsgenerators lassen sich i.a. Rückschlüsse auf den seed treffen und somit die Ergebnisse rekonstruieren.

    Was generell recht bewährte Mittel sind, sind bspw. Public-Key-Verfahren (bspw. X.509), Schlüssel-Austausch-Verfahren (bspw. Diffie-Hellman) oder generell Verschlüsselungsverfahren (bspw. RSA, AES).

    Mal noch ein kleines Beispiel für Xor:
    Man hat die folgende Eingabe:
    - Eingabe: "EineEingabe"
    - Schlüssel: "EinSchluessel"
    Das erste, was man jetzt macht, ist, dass man beide Zeichenketten in Bytes übersetzt, d.h. man verwendet bspw. System.Text.Encoding.Unicode, um die Zeichen in eine Zahlendarstellung zu übersetzen, da Xor auf Zahlen definiert ist, nicht aber auf Zeichen.
    Aus logischer Sicht geht man wie folgt vor:
    Es werden nacheinander alle Zeichen der Eingabe durchgegangen und mit dem jeweils an der gleichen Position liegenden Zeichen kombiniert. Also das "E" der Eingabe mit dem "E" des Schlüssels, "i" mit "i", "n" mit "n" und "e" mit "S", usw. Wäre der Schlüssel jetzt kürzer, als die Eingabe, würde der Schlüssel beim Erreichen des Endes bspw. wieder am Anfang anfangen (je nach Regel, man könnte auch an einer beliebigen, für beide Seiten bekannten Stelle wieder ansetzen).
    Das Resultat bezeichne ich hier einfach mal als Ergebnis. Es liegt in Byte-Form vor.
    Wenn aus dem Ergebnis wieder die Eingabe erzeugt werden soll, wird der gleiche Vorgang genau umgekehrt durchgeführt: Der Schlüssel ist ja bekannt, der wird wieder in Bytes übersetzt, anschließend werden alle Bytes des Ergebnisses über xor mit den Bytes des Schlüssels verknüpft - und zwar exakt genauso, wie das oben mit den Eingabe-Bytes der Fall war. Anschließend wird das Resultat dieses Vorgangs wieder zu einer String-Darstellung umgewandelt und die ursprüngliche Eingabe erhalten.

    Viele Grüße
    ~blaze~