Der Schlüssel ist, eine Megatonnen Proben zu erhalten, damit die Analyse etwas zu essen hat. Es ist wirklich hilfreich, wenn Sie die Beispiele in eine Datenbanktabelle oder ein Wörterbuch einfügen können, die interaktiv abgefragt werden können, z. von einer Art Skript-Shell. Python sollte bewundernswert funktionieren, aber ich habe nicht viel Erfahrung damit, da ich Visual FoxPro in den letzten zwei Jahrzehnten für interaktives Höhlenforschung verwendet habe.
Sobald Sie Ihre Beispiele zur Abfrage bereit haben, können Sie sie testen verschiedene einfache Hypothesen und widerlegen sie, indem sie Gegenbeispiele finden. Zum Beispiel scheinen die folgenden Beispiele darauf hinzudeuten, dass ein Unterschied im vierten Byte einen vierfachen Unterschied in der Prüfsumme verursacht:
00h 5Ch A2h 00h 00h 01h 7Fh00h 5Ch A2h 01h 00h 01h 63h00h 5Ch A2h 02h 00h 01h 67h00h 5Ch A2h 03h 00h 01h 6Bh 00h 5Ch A2h 04h 00h 01h 6Fh
Der Schlüssel besteht darin, Stichproben zu finden, die sich nur in der aktuellen 'Arbeits'-Spalte und der Prüfsumme unterscheiden, um den Effekt zu untersuchen was eine Änderung in der Arbeitsspalte auf der Prüfsumme hat. Angesichts der obigen Eingabe könnten wir beispielsweise 4 * b [3]
als vorläufigen Term für das vierte Byte notieren und dann die Beispieldatenbank nach Gegenbeispielen abfragen, wenn dies nicht funktioniert. Das heißt, Sie wählen Stichprobenpaare aus, die sich nur im vierten Byte und in der Prüfsumme unterscheiden, und zählen die Anzahl der Erfolge und Misserfolge für
Delta (Prüfsumme) mod 256 == 4 * Delta (Byte [3]) Mod 256.
Das ist sowieso die Idee. Wie so etwas wie delta (Prüfsumme) mod 256
tatsächlich aussieht, hängt natürlich von Ihrer Skript-Shell ab. Mit VFP wäre es
mod (256 + asc (substr (rechts, 7, 1)) - asc (substr (links, 7, 1)), 256)
Der vollständige Ausdruck für den obigen Test wäre ziemlich lang, sodass Sie normalerweise kleine Hilfsfunktionen schreiben würden. Mit einem Helfer namens byte_delta ()
, der das Ergebnis auf den Bereich [0, 255] normalisiert, den Sie möglicherweise haben
wähle le.sample als links, ri.sample als rechts; von all_samples le, all_samples ri; wo Zeug (links (ri.sample, 6), 4, 1, "") == Zeug (links (le.sample, 6), 4, 1, ""); und le.sample <> ri.sample; in den Cursor byte_3_pairsselect byte_delta (rechts, links, 7) == mod (4 * byte_delta (rechts, links, 4), 256) als ok, count (*); von byte_3_pairs; Gruppieren nach 1
Im betrachteten Fall erhalten Sie ein gemischtes Bild für diese Abfrage (siehe Unterschied zwischen erstem und zweitem Beispiel oben, E4 statt 4). Normalerweise würden Sie zuerst einiges an Unterschieden auswählen, um ein Gefühl für die Dinge zu bekommen. 'Unterschied' kann ein arithmetischer Unterschied sein, bitweises xor oder was auch immer.
Deshalb benötigen Sie eine interaktive Shell wie Python oder VFP. Mit den Edit-Compile-Run-Zyklen einer kompilierten Sprache wäre dies ziemlich umständlich. Ich habe die VFP-Beispiele gegeben, weil Skriptsprachen mit Datenbankunterstützung die Dinge hier viel einfacher machen können.
Für einfache gewichtete Summen wie die üblichen 'vom Menschen berechenbaren' Prüfsummen in Dingen wie ISBNs ergeben sich ziemlich schnelle Ergebnisse . Ich habe diesen Ansatz verwendet, um alle in deutschen Krankenversicherungsnummern verwendeten Prüfzifferschemata - die größtenteils undokumentiert sind (oder zumindest zu diesem Zeitpunkt waren) - aus unterschiedlichen Probenmengen zu bestimmen. In diesem Fall hatte ich natürlich den Vorteil, dass der Grundtyp des Schemas - eine gewichtete Ziffernsumme - bekannt war und sich die Stichproben bereits in Datenbanktabellen befanden ...
Der diskutierte Fall ist schwieriger, weil das Grundschema noch nicht bekannt ist. Deshalb ist es wichtig, die Bitmuster zu betrachten, um ein Gefühl für die Dinge zu bekommen. Zum Beispiel zeigen Blasenübertragungen eine additive Funktion an. Dies wird ausführlicher im Thema Umkehren einfacher Nachrichten + Prüfsummenpaare (32 Byte) erläutert, in dem auch einige Beispiele für Änderungsmuster aufgeführt sind.
P.S.: Neben dem Versuch, Prüfsummenunterschiede für Änderungen in bestimmten Bits oder Bytes herauszufiltern, gibt es viele andere Dinge, die getan werden können, wenn die Beispiele in eine Art abfragbare Tabelle / Wörterbuch / Karte gestopft wurden. Das erste ist normalerweise, eine Reihe von Tests mit vorhandenen Standardfunktionen wie der geraden Bytesumme, dem geraden Byte xor, verschiedenen CRCs usw. durchzuführen, um den Unterschied (Arithmetik und xor) zur Prüfsumme zu beobachten. Das Anzeigen von Ergebnissen als Bitmuster - wie im verlinkten Artikel gezeigt - kann häufig hilfreich sein, um Regelmäßigkeiten zu erkennen, die im hexadezimalen oder dezimalen Format nicht so offensichtlich sind.
UPDATE Samples sind zu ähnlich (keine Unterschiede in den ersten drei Bytes) und es gibt zu wenige davon, um Hypothesen schnell zu verwerfen. Mit anderen Worten, es gibt einfach zu viele potenzielle Funktionen, die zu den vorhandenen Daten passen würden ...
Beispielsweise sagt die folgende einfache Fox-Funktion die Prüfsumme für die ursprüngliche Handvoll Stichproben korrekt voraus, mit Ausnahme einiger weniger Fälle, in denen es um 0x20 ausgeschaltet ist:
Funktion f (s) lokales x, ix = 0 für i = 1 bis len (ms) - 1 x = Bit und (Bitverschiebung (mx, 1) + asc (substr (ms, mi, 1)), 0xFF) next i return bitand (mx + 0x8E, 0xFF)
Das könnte daran liegen, dass es sich um eine Drehung statt um eine Verschiebung handelt, oder Es handelt sich um ein xor oder eine andere Verschiebung (relativ prim zu 8), die sich mit der Bitanzahl pro Byte überlappt, um einen Abstand von zwei Bits zwischen dem vierten Byte und der Prüfsumme zu erzeugen. Eine Drehung um 5 würde das tun. Es gibt jedoch viele andere Möglichkeiten ... Deshalb brauchen wir viel mehr Proben. ;-)
Die Analyse der Stichproben in PasteBin zeigt, dass ein Unterschied in der letzten Byteposition vor der Prüfsumme immer gleich dem Unterschied in der Prüfsumme ist. Dies bedeutet, dass das letzte Byte und seine Auswirkung auf die Prüfsumme aus der Stichprobenbasis entfernt werden können. Dies erhöht die Anzahl der Proben, die sich in nur einer Byteposition unterscheiden, was bedeutet, dass mehr niedrig hängende Früchte für die Analyse vorhanden sind ...
z. die Proben
00 5C A0 00 00 00 00 06 00: 6900 5C A0 00 00 00 00 06 01: 6A ... 00 5C A0 00 00 00 00 06 FF: 68
Alle werden dem neuen Beispiel zugeordnet (der Punkt zeigt ein entferntes Byte an, nur um dies hier darzustellen):
00 5C A0 00 00 00 00 00 06. 69
Die verkürzte Beispielbasis zeigt sofort Fälle an, in denen die Zweierpotenzregel nicht funktioniert (das letzte Byte hier ist ursprünglich das vorletzte):
00 5C A0 00 00 00 00 00 00. 7D00 5C A0 00 00 00 00 00 01. 7F00 5C A0 00 00 00 00 00 02. 61 <-Differenz -0x20 zum vorhergesagten Delta 200 5C A0 00 00 00 00 00 03. 6300 5C A0 00 00 00 00 00 04. 65 ... 00 5C A0 00 00 00 07 00 00. B5 00 5C A0 00 00 00 08 00 00. BD00 5C A0 00 00 00 09 00 00. A5 <-Differenz -0x20 zum vorhergesagten Delta 800 5C A0 00 00 00 0A 00 00. AD00 5C A0 00 00 00 0B 00 00. D5 < - wieder auf dem richtigen Weg mit der früheren Sequenz