문제

반전 방법을 찾고 있습니다 CRC32 체크섬. 주변에 솔루션이 있지만 둘 중 하나입니다 잘못 쓰여진, 매우 기술적입니다 및/또는 어셈블리에서. 어셈블리는 (현재) 내 켄을 넘어서서 누군가가 더 높은 수준의 언어로 구현할 수 있기를 바라고 있습니다. 루비는 이상적이지만 PHP, Python, C, Java 등을 구문 분석 할 수 있습니다.

테이커가 있습니까?

도움이 되었습니까?

해결책

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를 반전시키고 파일 끝에서 일련의 바이트를 추가하여 PHP 에서이 스레드에 게시 한 원래 CRC와 일치하도록 일련의 바이트를 추가합니다.

나는 그것에 약간의 시간을 보냈으므로 더 힘든 문제를 해결하는 누군가를 도울 수 있기를 바랍니다.CRC32 역전 건배!

Cade Roux는 CRC32를 역전시키는 데 옳습니다.

당신이 언급 한 링크는 원래 바이트 스트림을 변경함으로써 Invalide가 된 CRC를 수정하는 솔루션을 제공합니다. 이 수정은 일부 (중요하지 않은) 바이트를 변경하여 원래 CRC 값을 재현하여 달성됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top