Xor-Verschlüsselung in PHP
Ich bin neu Xor-Verschlüsselung, und ich habe einige Schwierigkeiten mit dem folgenden code:
function xor_this($string) {
//Let's define our key here
$key = ('magic_key');
//Our plaintext/ciphertext
$text =$string;
//Our output text
$outText = '';
//Iterate through each character
for($i=0;$i<strlen($text);)
{
for($j=0;$j<strlen($key);$j++,$i++)
{
$outText .= $text{$i} ^ $key{$j};
//echo 'i='.$i.', '.'j='.$j.', '.$outText{$i}.'<br />'; //for debugging
}
}
return $outText;
}
Wenn ich diesen starte, es funktioniert für normale Zeichenfolgen, wie 'Hund', aber es nur teilweise funktioniert für strings, die Ziffern enthalten, wie z.B. '12345'.
Demonstrieren...
xor_this('dog')
= 'UYV'
xor_this('123')
= "
Es ist auch interessant zu beachten, dass xor_this( xor_this('123') )
= '123', wie ich es erwarten. Ich bin mir ziemlich sicher, dass das problem befindet sich irgendwo in meinem wackeligen Verständnis von bit-Operatoren, ODER vielleicht der Weg von PHP verarbeitet strings, die zahlen enthalten. Ich Wette, da ist jemand clever aus, dass es weiß, was genau hier falsch. Danke.
EDIT #1: Es ist nicht wirklich 'Verschlüsselung'. Ich denke, Verschleierung ist der richtige Begriff, das ist, was ich Tue. Ich übergeben zu müssen, ein code mit unwichtigen Daten von einem Benutzer, ohne dass Sie in der Lage, leicht zu manipulieren es. Sie sind der Abschluss eines zeitlich Aktivität off-line und übermitteln Sie Ihre Zeit, um ein online-Anzeiger über diesen code. Die off-line-Aktivität verschleiern Ihrer Zeit (in Millisekunden). Ich muss ein Skript schreiben, diesen code zu erhalten und ihn wieder in die Zeichenfolge, die zu Ihrer Zeit.
- Ich hoffe, Sie nicht zu verwenden beabsichtigen, dies für etwas mehr als Hausaufgaben 😛
- Versuchen casting
$string
einen string wie:$string = (string)$string
. Auch, beachten Sie, dass "Verschlüsselung" ein ziemlich starkes Wort für XORing Dinge, also verwenden Sie diese nicht in einer Produktionsumgebung. - Sie arbeiten zu hart. PHP wird gerne verknüpft jedes Zeichen einer Zeichenkette, und geben Sie das Ergebnis als eine andere Zeichenfolge ein. Sie brauchen nicht eine Schleife, es selbst zu tun, nur tun
$str1 ^ $str2
. Aber WATCH OUT! Der Ergebnis-string so lang wie die kürzeste Zeichenfolge! (Einschließlich der leeren Zeichenfolge!) Also pad die Saiten zuerst, oder haben Sie Sie in Stücke. - Ihr wohl sicherer UND haben viel weniger Arbeit, wenn Sie nur einige der eingebauten encoding/decoding-Funktionen, die php bereits hat. Zum Beispiel die mcrypt-Funktionen. Die phpdoc-Seite hat Beispiele.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie ich es gemacht habe, könnte jemand helfen ...
Ich denke, Sie haben vielleicht ein paar Probleme hier, die ich versucht habe zu skizzieren, wie ich glaube, Sie können es zu beheben:
Müssen Sie
ord(..)
um den ASCII-Wert eines Zeichens, so dass Sie stellen es in der binären. Zum Beispiel, versuchen Sie Folgendes:Ich bin mir nicht sicher, wie Sie Sie tun eine XOR-Verschlüsselung mit einem multi-byte-Schlüssel, wie die wikipedia-Seite über XOR-Chiffre nicht angeben. Aber ich nehme an, für einen bestimmten Schlüssel wie "123", Ihr Schlüssel beginnt mit "Linksbündig" und erstreckt sich auf die Länge des Textes, so wie hier:
Verschlüsselt
'hello'
Breite der Schlüssel'12312'
.Es gibt keine Garantie, dass das Ergebnis der XOR-operation erzeugt eine druckbare Zeichen. Wenn Sie uns eine bessere Vorstellung von dem Grund, warum Sie dies tun, können wir wahrscheinlich verweisen Sie auf etwas vernünftiges zu tun, anstatt.
Ich glaube, Sie sind konfrontiert mit der Ausgabe der Konsole-und encoding-problem, statt der XOR-verknüpft.
Versuchen, output-Ergebnisse der xor-Funktion in eine text-Datei und eine Reihe von generierten Zeichen. Ich glaube HEX-editor wäre die beste Wahl sein, zu beobachten und zu vergleichen generierten Zeichen gesetzt.
Grundsätzlich zu verwerfen-text zurück (gerade zahlen sind), können Sie verwenden die gleiche Funktion:
Basiert auf der Tatsache, dass Sie immer
xor_this( xor_this('123') ) = '123'
ich bin bereit zu erraten, dass dies lediglich ein Ausgabe-Problem. Sie senden Daten an den browser, die browser erkennen es als etwas, was dargestellt werden soll in HTML (sagen wir, das erste halbe Dutzend ASCII-Zeichen). Schauen Sie sich einmal den Quelltext der Seite, um zu sehen, was wirklich da ist. Besser noch, Durchlaufen die output-und echo derord
der Wert an jeder position.Verwenden Sie diesen code, es funktioniert perfekt
Versuchen Sie dies:
Wenn einer der beiden Operanden ist ein integer, PHP wirft der andere ein integer und XORs Sie für ein numerisches Ergebnis.
Alternativ könnten Sie verwenden:
Hinweis: es wird wahrscheinlich einige komische Zeichen...
Trotz allen klugen Vorschläge, ich löste dieses problem in einer viel einfacheren Weg:
Ich habe die Schlüssel! Es stellt sich heraus, dass durch das ändern der Schlüssel, um etwas wie dies:
$key = 'ISINUS0478331006';
...generiert es eine verschleierte Ausgabe des druckbaren Zeichen.