سؤال

أنا أبحث عن وسيلة للعكس الاختباري CRC32.. وبعد هناك حلول حولها، لكنها كذلك مكتوبة بشكل ردىء, تقنية للغاية و / أو في التجمع. وبعد التجمع هو (حاليا) وراء كين بلدي، لذلك آمل أن يتمكن شخص ما من بعضا من التنفيذ في لغة أعلى مستوى. روبي مثالي، لكن يمكنني تحليل PHP، بيثون، ج، جافا، إلخ.

أي من الأشخاص يود ذلك؟

هل كانت مفيدة؟

المحلول

لا يمكن عكس CRC32 إلا إذا كانت السلسلة الأصلية هي 4 بايت أو أقل.

نصائح أخرى

اقرأ الوثيقة تسمى "عكس نظرية CRC وممارسة".

هذا هو 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;
        }
    }
}

يمكنك عكس ذلك عن طريق دعم البتات لتوليد 32 بت الأصلي إذا كنت تعرف بولي تم إنشاؤه به. ولكن إذا كنت تتطلع إلى عكس CRC32 من ملف معين وإلحاق سلسلة من البايتات في نهاية الملف لتتناسب مع رمز CRC الأصلي الذي نشرته على هذا الموضوع في PHP:

قضيت بعض الوقت في ذلك، لذلك آمل أن يتمكن من مساعدة شخص يعمل على مشاكل أكثر صرامة:عكس CRC32. هتافات!

Cade Roux هو الصحيح في عكس CRC32.

توفر الروابط التي ذكرتها حلا لإصلاح اتفاقية حقوق الطفل التي أصبحت غاضبة من خلال تغيير دفق البايت الأصلي. يتم تحقيق هذا الإصلاح عن طريق تغيير بعض البايتات (غير المهتمين) وإعادة إخراج قيمة CRC الأصلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top