Sonntag, Dezember 15, 2019

Die Umkehrung CRC32

Ich bin auf der Suche nach einem Weg, um reverse –eine CRC32-Prüfsumme. Es gibt Lösungen um, aber Sie sind entweder schlecht geschrieben, extrem technische und/oder in der Montage. Die Montage ist (derzeit) jenseits meiner ken, so bin ich der Hoffnung, jemand kann Stück zusammen eine Implementierung in einer Sprache auf höherer Ebene. Ruby ist ideal, aber ich kann analysieren, PHP, Python, C, Java, etc.

Irgendwelche Abnehmer?

  • Was genau meinst du mit „umgekehrten“
  • Nur Portierung einer C-Implementierung Python: github.com/jellever/Pwnage/blob/master/reversecrc.py
  • Können Sie zeigen Sie auf die Tabelle für Ihren code, um zu arbeiten. Was kann ich hinzufügen, hier: #Benutzerdefinierte CRC-Tabelle, ersetzen Sie mit Ihrem eigenen table = []
InformationsquelleAutor pat | 2009-10-03

4 Kommentare

  1. 19

    Einer CRC32 ist nur reversibel, wenn der ursprüngliche string ist 4 Byte oder weniger.

    • Ich bezweifle, crc erzeugt einen einzigartigen 32-bit-code für jede string-combo 4 bytes oder weniger …
    • Wenn man sich an die Umsetzung, für 4 bytes, es zu tun 3 8-bit-Verschiebungen nur mit XOR-Operationen, also ja, es ist reversibel: sanity-free.org/12/crc32_implementation_in_csharp.html
    • Das ist das, was ich mir anfangs dachte, und dann hatten die Leute zu schicken die links, die oben erwähnt meine Art… und natürlich die Tatsache, dass es ist begrenzt auf 4 Byte wurde beschönigt. Vielen Dank für die Klarstellung.
    • Wenn CRC basiert auf primitiven Polynom, was in der Regel ist, bedeutet das, dass er zurückkehren wird eindeutigen Schlüssel für jede der 2^32 imputs.
    • Findet den Punkt: obwohl CRC32 ist nicht immer reversibel, gegeben, dass eine bestimmte CRC32-Wert ist eine CRC von echten Saiten, ist es unbedingt reversibel.
    • Ich denke, man kann nicht bauen eine 4-byte-Zeichenfolge für jede gegebene 32-bit-Wert erzeugen würde, dass der Wert als CRC32 (es vermutlich keine perfekte Entropie). Es ist wohl wahr, die Sie erstellen können einige string zu erzeugen, einen bestimmten Wert als seine CRC32. Es gibt eine unendliche Zahl von Saiten, die die gleiche CRC32. Daher der Begriff der Reversibilität ist ziemlich begrenzt – Sie können nur Eine Zeichenkette die den CRC32, nicht unbedingt die RICHTIGE Zeichenfolge (im Sinne von Fehler-Korrektur). Ich nahm Reversibilität in dem Sinne, dass Sie diese benötigen würden, um eine bijektive Funktion, welche es nicht ist.
    • die Frage ist, was gemeint ist, durch die Rückseite, in der Tat.
    • Es ist nicht nur möglich, konstruieren Sie eine Sequenz von vier bytes, die für jeden 32-bit-Wert generiert, der CRC32, aber angesichts einer Sequenz von vier bytes oder mehr, wählt man alle 32 bits der sequence (konzentriert sich auf vier bytes oder verstreut in der gesamten Sequenz), jede Kombination von Werten für die 32 bits generieren, die eine andere CRC32; die Bestimmung, welche Kombination der Werte für die bits, um die Ausbeute eines gewünschten CRC32 ist nicht schwer.

  2. 5

    Lesen das Dokument nennt „Umkehr CRC-Theorie und Praxis“.

    Dies ist C#:

    public class Crc32
    {
        public const uint poly = 0xedb88320;
        public const uint startxor = 0xffffffff;
    
        static uint[] table = null;
        static uint[] revtable = null;
    
        public void FixChecksum(byte[] bytes, int length, int fixpos, uint wantcrc)
        {
            if (fixpos + 4 > length) return;
    
            uint crc = startxor;
            for (int i = 0; i < fixpos; i++) {
                crc = (crc >> 8) ^ table[(crc ^ bytes[i]) & 0xff];
            }
    
            Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4);
    
            crc = wantcrc ^ startxor;
            for (int i = length - 1; i >= fixpos; i--) {
                crc = (crc << 8) ^ revtable[crc >> (3 * 8)] ^ bytes[i];
            }
    
            Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4);
        }
    
        public Crc32()
        {
            if (Crc32.table == null) {
                uint[] table = new uint[256];
                uint[] revtable = new uint[256];
    
                uint fwd, rev;
                for (int i = 0; i < table.Length; i++) {
                    fwd = (uint)i;
                    rev = (uint)(i) << (3 * 8);
                    for (int j = 8; j > 0; j--) {
                        if ((fwd & 1) == 1) {
                            fwd = (uint)((fwd >> 1) ^ poly);
                        } else {
                            fwd >>= 1;
                        }
    
                        if ((rev & 0x80000000) != 0) {
                            rev = ((rev ^ poly) << 1) | 1;
                        } else {
                            rev <<= 1;
                        }
                    }
                    table[i] = fwd;
                    revtable[i] = rev;
                }
    
                Crc32.table = table;
                Crc32.revtable = revtable;
            }
        }
    }
    
  3. 1

    Können Sie umkehren durch Rückwärtsfahren aus der bits zu erzeugen, die ursprüngliche 32-bit wenn Sie wissen, die poly es erstellt wurde. Aber wenn Sie schauen, um Umgekehrt die CRC32 aus einer angegebenen Datei und fügen Sie eine Serie von bytes am Ende der Datei entsprechend den ursprünglichen CRC-ich code gepostet auf diesen thread in PHP:

    Verbrachte ich ein wenig Zeit auf, so dass ich hoffe, es kann helfen, jemand arbeitet auf härtere Probleme:
    Die Umkehrung CRC32
    Prost!

    • Die Umkehrung von Anhängen hat den Nachteil, dass es besiegt werden kann durch eine einfache Länge schauen. Viel praktischer wäre die reverse-match ein crc, indem die Daten in bestimmten Grenzen innerhalb der Datei, die geändert werden…
  4. 0

    Cade Roux Ist rechts über die Umkehrung CRC32.

    Die links, die Sie erwähnten, eine Lösung zu beheben CRC geworden invalide durch die Veränderung der ursprünglichen byte-stream. Diese Korrektur wird erreicht, indem Sie einige (unwichtige) bytes und damit der Wiederherstellung der ursprünglichen CRC-Wert.

    • Oder das hacken der stream so, dass die CRC ist unverändert, während die wichtigen Daten (wie anti-Piraterie-code) geändert wird.

Kostenlose Online-Tests

Ihre Entwicklerrolle