Wie XOR von zwei hex-Zeichenketten, so dass jedes byte wird XORed getrennt?
Ich haben Beitrag ähnliche Fragen hier für ein paar Tage jetzt, aber es scheint, wie ich wurde nicht gefragt, das richtige zu tun, so entschuldigen Sie mich, wenn ich erschöpft haben Sie mit meinem XOR-Fragen :D.
Auf den Punkt - ich habe zwei hex-Zeichenketten, und ich will XOR diese Zeichenfolgen, so dass jedes byte wird XORed separat (D. H. jedes paar von zahlen ist XORed separat). Und ich möchte das in python und ich möchte in der Lage sein, Zeichenketten unterschiedliche Längen haben. Ich werde tun, ein Beispiel, manuell zu veranschaulichen mein Punkt (ich habe die code-Umgebung, da es mir erlaubt, zu legen Sie in den Räumen wo ich will Sie sein):
Input:
s1 = "48656c6c6f"
s2 = "61736b"
Encoding in binary:
48 65 6c 6c 6f = 01001000 01100101 01101100 01101100 01101111
61 73 6b = 01100001 01110011 01101011
XORing the strings:
01001000 01100101 01101100 01101100 01101111
01100001 01110011 01101011
00001101 00011111 00000100
Converting the result to hex:
00001101 00011111 00000100 = 0d 1f 04
Output:
0d1f04
Also, um es zusammenzufassen, ich möchte in der Lage sein, um Eingang zwei hex-strings (diese werden in der Regel ASCII-Zeichen codiert in hex) unterschiedlicher oder gleicher Länge und erhalten Ihre XOR, so dass jedes byte wird XORed getrennt.
- Warum nicht Zyklus die
s2
Schlüssel und für alle Zeichen ders1
? Warum gelten Sie es nur für die letzten 3?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
binascii.unhexlify()
um Ihre hex-strings zu Binärdaten, dann XOR, dass, gehen Sie zurück zu hex mitbinascii.hexlify()
:Den tatsächlichen XOR angewendet wird pro byte des dekodierten Daten (mit
ord()
undchr()
zu gehen und von ganzen zahlen).Beachten, dass wie in deinem Beispiel, die ich abgeschnitten
s1
auf die gleiche Länge wies2
(ignorieren Zeichen vom start vons1
). Kodieren Sie alle vons1
mit einem kürzeren Schlüssels2
durch Radfahren die bytes:Du nicht haben Verwendung
unhexlify()
, aber es ist viel einfacher als Schleifen übers1
unds2
2 Zeichen in einer Zeit und mitint(twocharacters, 16)
zu drehen, die in integer-Werte für XOR-Operationen.Den Python-3-version der oben genannten ist ein wenig leichter zu machen; verwenden Sie
bytes()
stattstr.join()
und Sie können die drop -chr()
undord()
Anrufe, die Sie erhalten, Durchlaufen Sie Ganzzahlen direkt:zip()
dauert mehrere input-Sequenzen, und Paare Ihre Elemente. So gibt es Ihnen eine Sequenz von[(s1[0], s2[0]), (s1[1], s2[1]), ...]
mit jedem Tupel gebildet, indem Elemente aus jedem Eingabe-Sequenz an den selben index.zip()
hat zwei input-Listen, die jedes output-element ist ein Tupel mit zwei Werten. Diefor
Schleife entpackt diese in zwei Wert (genau wie Sie tun können, Tupel-Auspacken in der regulären Zuweisung,foo, bar = ('spam', 'eggs')
weistfoo = 'spam'
undbar = 'eggs'
.'llo'
von'Hello'
) mit den 3 Zeichen Ihres Schlüssels (ask
), verschlüsseln wir alleHello
durch die Wiederverwendung der Schlüssel, beginnend mit der beginnen Sie wieder, wenn Sie das Ende erreichen;H
mita
,e
mits
,l
mitk
, mit dem Rad dann wieder zum Anfang und Kodierenl
mita
, undo
mits
. Dieitertools.cycle()
Methode ermöglicht uns die Umsetzung Radfahren übers2
mit nur einer Funktion.Fand ich eine sehr einfache Lösung:
Es wird xor der Zeichenkette, bis eine Thema endet
return format(result, 'x')
.Ich bin mir nicht sicher, was du genau suchst, aber hoffentlich nützlich sein für Sie.
Beginnend mit zwei normalen Saiten, können Sie Ihre Ergebnisse etwas wie das zu tun: