Portierungscode, der unsigned Char-Zeiger in C zu C # enthält

7

Ich habe diesen Code in C, den ich nach C # portieren muss:

%Vor%

Ich habe es versucht:

%Vor%

Aber das Ergebnis stimmt nicht mit dem erwarteten überein.

Nach dem Beispiel:

%Vor%

sollte dies werden:

%Vor%

Es sagt auch, das erste Byte ist nicht verschlüsselt, deshalb bleibt A5 gleich.

Zur Klärung BEARBEITEN : Die Spezifikation sagt nur, dass Sie das erste Byte überspringen sollten, es geht nicht ins Detail, also schätze ich, dass Sie nur die Sequenz von Position 1 bis zur letzten Position übergeben Überspringen des ersten Bytes.

Aber mein Ergebnis mit diesem C # -Port ist:

%Vor%

Ist dieser Port korrekt oder fehlt mir etwas?

BEARBEITEN 2 : Für weitere Erläuterungen ist dies ein geschlossenes Protokoll, daher kann ich nicht ins Detail gehen. Aus diesem Grund habe ich gerade genug Informationen bereitgestellt, um den Code, den C-Code, zu portieren dasjenige, das mir gegeben wurde, und genau das hat die Spezifikation gesagt. Das eigentliche Problem war, dass die "0xAA" in der Spezifikation falsch war, deshalb war die Ausgabe nicht die erwartete. Der hier bereitgestellte C # -Code und die akzeptierte Antwort sind schließlich korrekt.

    
Mahmoud 04.03.2013, 21:37
quelle

7 Antworten

9

Lasst es uns brechen, Schritt für Schritt.

%Vor%

Unabhängig von einigen anderen Bemerkungen ist dies wie Sie normalerweise diese Dinge in C / C ++ tun. Es gibt nichts Besonderes an diesem Code, und es ist nicht allzu kompliziert, aber ich denke, es ist gut, es zu brechen, um Ihnen zu zeigen, was passiert.

Zu beachten:

  1. unsigned char ist im Grunde dasselbe wie Byte in c #
  2. vorzeichenlose Länge hat einen Wert zwischen 0-65536. Int sollte den Trick machen.
  3. Puffer hat ein Post-Inkrement
  4. Die Byte-Zuweisung (+ = 0xC9) wird überlaufen. Wenn es überläuft, wird es in diesem Fall auf 8 Bit gekürzt.
  5. Der Puffer wird von ptr übergeben, so dass der Zeiger in der aufrufenden Methode gleich bleibt.
  6. Das ist nur einfacher C-Code, kein C ++. Es ist ziemlich sicher anzunehmen, dass Benutzer hier keine Überlastung des Bedieners anwenden.

Das einzige "schwierige" Ding hier ist der Buffer ++. Details können in dem Buch "Exceptional C ++" von Sutter gelesen werden, aber ein kleines Beispiel erklärt das auch. Und zum Glück haben wir ein perfektes Beispiel dafür. Eine literale Übersetzung des obigen Codes lautet:

%Vor%

In diesem Fall kann die Temperaturvariable trivial gelöst werden, was uns zu folgendem führt:

%Vor%

Das Ändern dieses Codes in C # ist jetzt ziemlich einfach:

%Vor%

Das ist im Grunde genommen dasselbe wie Ihr portierter Code. Das bedeutet, dass irgendwo auf der Straße etwas anderes schief gelaufen ist ... Also lasst uns den Cryptobuffer hacken, oder? : -)

Wenn wir annehmen, dass das erste Byte nicht verwendet wird (wie Sie sagten) und dass "0xAA" und / oder "0xC9" falsch sind, können wir einfach alle Kombinationen ausprobieren:

%Vor%

Da gehen wir: oops gibt es keine Lösungen. Das bedeutet, dass der Cryptobuffer nicht das tut, was er zu tun glaubt, oder ein Teil des C-Codes fehlt hier. F.ex. übergeben sie wirklich "Buffer" an die CryptoBuffer-Methode oder haben sie den Zeiger vorher geändert?

Abschließend denke ich, die einzige gute Antwort hier ist, dass kritische Informationen zur Lösung dieser Frage fehlen.

    
atlaste 08.03.2013, 21:36
quelle
5

Das von Ihnen angegebene Beispiel stimmt nicht mit dem Code im C-Beispiel überein, und der C- und der C # -Code liefern identische Ergebnisse.

    
Kobo 04.03.2013 22:36
quelle
3

Die Portierung sieht richtig aus; Kannst du erklären, warum 03 zu 6F werden sollte? Die Tatsache, dass das Ergebnis bis 03 um den "erwarteten" Wert zu sein scheint, ist für mich etwas verdächtig.

    
Eric Lippert 04.03.2013 21:53
quelle
1

Der Port sieht richtig aus.

Was ich in dieser Situation tun würde, ist ein Stück Papier und einen Stift herauszunehmen, die Bytes in Binärform auszugeben, den XOR zu machen und dann die Addition. Vergleichen Sie dies nun mit den C- und C # -Codes.

    
SamiHuutoniemi 04.03.2013 21:50
quelle
1

In C # wird das Byte überlaufen, so dass es auf 0x72 gekürzt wird. Hier ist die Mathematik für die Konvertierung der 0x03 in binär und hex:

%Vor%     
David 04.03.2013 21:52
quelle
0

Bei der ursprünglichen Methode in C nehmen wir zuerst an, dass die Sequenz auf eine symmetrische Weise mit dem Aufruf von CryptoBuffer

entschlüsselt / verschlüsselt wird
  • ruft zunächst a5 03 18 01 ...

    auf %Vor%

    dann auf d8 72 7b 74 ...

    %Vor%
  • ruft zunächst a5 6f 93 8b ...

    auf %Vor%

    dann auf d8 8e 02 ea ...

    %Vor%

und wir wissen, dass es nicht machbar ist.

Natürlich haben Sie möglicherweise eine asymmetrische Entschlüsselungsmethode; aber zuerst müssten wir entweder a5 03 18 01 ... => a5 6f 93 8b ... oder die Umkehrung der Richtung mit irgendeiner möglichen magischen Zahl beweisen. Der Code einer Analyse mit einem Brute-Force-Ansatz wird hinter dem Post eingefügt.

Ich machte die magische Zahl eine Variable zum Testen. Mit Reproduzierbarkeitsanalyse fanden wir heraus, dass die ursprüngliche Sequenz alle 256 Aufrufe auf kontinuierlich variierten magischen Zahlen reproduziert werden kann. Okay, mit dem, was wir durchgemacht haben, ist es hier noch möglich.

Die Machbarkeitsanalyse testet jedoch alle 256*256=65536 Fälle mit beiden Richtungen, von original => expected und expected => original , und keine macht es.

Und jetzt wissen wir, dass es keine Möglichkeit gibt, die verschlüsselte Sequenz zu dem erwarteten Ergebnis zu entschlüsseln.

Somit können wir nur sagen, dass das erwartete Verhalten beider Sprachen oder Ihres Codes identisch ist , aber das erwartete Ergebnis ist nicht möglich , weil die Annahme gebrochen ist .

Code für die Analyse

%Vor%     
Ken Kin 08.03.2013 11:54
quelle
0

Hier ist eine Demonstration

Ссылка

zeigt, dass der ursprüngliche Code bei einer Eingabe von A5 03 18 01 D8 72 7B 01 erzeugt; also

  1. Regel, dass das erste Byte nicht decodiert wird, kann nur korrekt sein, wenn der Puffer ab dem 2. gesendet wird (zeigen Sie uns den Aufruf)

  2. stimmt die Ausgabe nicht überein (Vermissen Sie andere Anrufe?)

Ihre Übersetzung ist also korrekt, aber Ihre Erwartungen an den ursprünglichen Code sind nicht richtig.

    
durilka 14.03.2013 14:44
quelle

Tags und Links