CRC32 체크섬은 어떻게 계산됩니까?
아마도 나는 그것을 보지 못하고 있지만 CRC32는 불필요하게 복잡해 보이거나 웹에서 찾을 수있는 곳에서 충분히 설명되지 않은 것처럼 보입니다.
나는 그것이 (생성자) 다항식으로 나눈 메시지 값의 비 캐리 기반 산술 분할의 나머지라는 것을 이해하지만 실제 구현은 나를 피합니다.
A Painless Guide To CRC Error Detection Algorithms를 읽었으며 이것이 고통스럽지 않았다고 말해야합니다. 그것은 이론을 다소 잘 다루지 만 저자는 결코 단순한 "이것이다"에 도달하지 않습니다. 그는 표준 CRC32 알고리즘에 대한 매개 변수가 무엇인지 말하지만 어떻게 도달하는지 명확하게 배치하는 것을 무시합니다.
나를 얻는 부분은 그가 "이것이다"라고 말한 다음 "그런데, 다른 초기 조건으로 되돌릴 수 있거나 시작할 수 있습니다."라고 덧붙이며 최종 방법에 대한 명확한 대답을 제공하지 않습니다. 방금 추가 한 모든 변경 사항을 고려하여 CRC32 체크섬을 계산합니다.
- CRC32 계산 방법에 대한 더 간단한 설명이 있습니까?
나는 테이블이 어떻게 형성되는지 C로 코딩하려고 시도했다.
for (i = 0; i < 256; i++)
{
temp = i;
for (j = 0; j < 8; j++)
{
if (temp & 1)
{
temp >>= 1;
temp ^= 0xEDB88320;
}
else {temp >>= 1;}
}
testcrc[i] = temp;
}
그러나 이것은 내가 인터넷의 다른 곳에서 찾은 가치와 일치하지 않는 가치를 생성하는 것 같습니다. 내가 할 수 내가 온라인으로 발견 된 값을 사용하지만, 나는 그들이 만든 방법을 이해하고 싶다.
이 엄청나게 혼란스러운 숫자를 정리하는 데 도움을 주시면 대단히 감사하겠습니다.
CRC32의 다항식은 다음과 같습니다.
x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1
또는 16 진수 및 2 진수 :
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
가장 높은 용어 (x 32 )는 일반적으로 명시 적으로 작성되지 않으므로 대신 16 진수로 표현할 수 있습니다.
0x 04 C1 1D B7
1과 0을 자유롭게 셀 수 있지만 다항식과 일치하는 것을 알 수 있습니다. 여기서는 1
비트 0 (또는 첫 번째 비트)이고 x
비트 1 (또는 두 번째 비트)입니다.
왜이 다항식인가? 주어진 다항식 표준이 필요하고 표준은 IEEE 802.3에 의해 설정 되었기 때문입니다. 또한 서로 다른 비트 오류를 효과적으로 감지하는 다항식을 찾는 것은 매우 어렵습니다.
CRC-32는 일련의 "캐리가없는 이진 산술"또는 기본적으로 "XOR 및 시프트 연산"으로 생각할 수 있습니다. 이를 기술적으로 다항식 산술이라고합니다.
더 잘 이해하려면 다음 곱셈을 생각하십시오.
(x^3 + x^2 + x^0)(x^3 + x^1 + x^0)
= (x^6 + x^4 + x^3
+ x^5 + x^3 + x^2
+ x^3 + x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
x가 2 진법이라고 가정하면 다음을 얻습니다.
x^7 + x^3 + x^2 + x^1 + x^0
왜? 3x ^ 3은 11x ^ 11이기 때문에 (하지만 1 또는 0의 사전 숫자 만 필요함) 다음과 같이 이어집니다.
=1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^100 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^101 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^110 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^111 + 1x^11 + 1x^10 + 1x^1 + x^0
그러나 수학자들은 규칙을 변경하여 mod 2가되도록했습니다. 따라서 기본적으로 모든 이진 다항식 mod 2는 캐리 나 XOR없이 덧셈에 불과합니다. 따라서 원래 방정식은 다음과 같습니다.
=( 1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0 ) MOD 2
=( 1x^110 + 1x^101 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0 )
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 (or that original number we had)
나는 이것이 믿음의 도약이라는 것을 알고 있지만 이것은 라인 프로그래머로서의 능력을 넘어서는 것입니다. 당신이 하드 코어 CS 학생 또는 엔지니어라면 나는 이것을 분해하기 위해 도전합니다. 모든 사람이이 분석의 혜택을받을 것입니다.
따라서 전체 예제를 해결하려면 :
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
이제 CRC 산술을 사용하여 증강 메시지를 Poly로 나눕니다. 이것은 이전과 동일한 부문입니다.
1100001010 = Quotient (nobody cares about the quotient)
_______________
10011 ) 11010110110000 = Augmented message (1101011011 + 0000)
=Poly 10011,,.,,....
-----,,.,,....
10011,.,,....
10011,.,,....
-----,.,,....
00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
-----,....
01011....
00000....
-----....
10110...
10011...
-----...
01010..
00000..
-----..
10100.
10011.
-----.
01110
00000
-----
1110 = Remainder = THE CHECKSUM!!!!
나눗셈은 우리가 버리는 몫과 계산 된 체크섬 인 나머지를 산출합니다. 이것으로 계산이 끝납니다. 일반적으로 체크섬이 메시지에 추가되고 결과가 전송됩니다. 이 경우 전송은 11010110111110입니다.
Only use a 32-bit number as your divisor and use your entire stream as your dividend. Throw out the quotient and keep the remainder. Tack the remainder on the end of your message and you have a CRC32.
Average guy review:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Take the first 32 bits.
- Shift bits
- If 32 bits are less than DIVISOR, go to step 2.
- XOR 32 bits by DIVISOR. Go to step 2.
(Note that the stream has to be dividable by 32 bits or it should be padded. For example, an 8-bit ANSI stream would have to be padded. Also at the end of the stream, the division is halted.)
A CRC is pretty simple; you take a polynomial represented as bits and the data, and divide the polynomial into the data (or you represent the data as a polynomial and do the same thing). The remainder, which is between 0 and the polynomial is the CRC. Your code is a bit hard to understand, partly because it's incomplete: temp and testcrc are not declared, so it's unclear what's being indexed, and how much data is running through the algorithm.
The way to understand CRCs is to try to compute a few using a short piece of data (16 bits or so) with a short polynomial -- 4 bits, perhaps. If you practice this way, you'll really understand how you might go about coding it.
If you're doing it frequently, a CRC is quite slow to compute in software. Hardware computation is much more efficient, and requires just a few gates.
For IEEE802.3, CRC-32. Think of the entire message as a serial bit stream, append 32 zeros to the end of the message. Next, you MUST reverse the bits of EVERY byte of the message and do a 1's complement the first 32 bits. Now divide by the CRC-32 polynomial, 0x104C11DB7. Finally, you must 1's complement the 32-bit remainder of this division bit-reverse each of the 4 bytes of the remainder. This becomes the 32-bit CRC that is appended to the end of the message.
The reason for this strange procedure is that the first Ethernet implementations would serialize the message one byte at a time and transmit the least significant bit of every byte first. The serial bit stream then went through a serial CRC-32 shift register computation, which was simply complemented and sent out on the wire after the message was completed. The reason for complementing the first 32 bits of the message is so that you don't get an all zero CRC even if the message was all zeros.
In addition to the Wikipedia Cyclic redundancy check and Computation of CRC articles, I found a paper entitled Reversing CRC - Theory and Practice* to be a good reference.
There are essentially three approaches for computing a CRC: an algebraic approach, a bit-oriented approach, and a table-driven approach. In Reversing CRC - Theory and Practice*, each of these three algorithms/approaches is explained in theory accompanied in the APPENDIX by an implementation for the CRC32 in the C programming language.
* PDF Link
Reversing CRC – Theory and Practice.
HU Berlin Public Report
SAR-PR-2006-05
May 2006
Authors:
Martin Stigge, Henryk Plötz, Wolf Müller, Jens-Peter Redlich
I spent a while trying to uncover the answer to this question, and I finally published a tutorial on CRC-32 today: CRC-32 hash tutorial - AutoHotkey Community
In this example from it, I demonstrate how to calculate the CRC-32 hash for the ASCII string 'abc':
calculate the CRC-32 hash for the ASCII string 'abc':
inputs:
dividend: binary for 'abc': 0b011000010110001001100011 = 0x616263
polynomial: 0b100000100110000010001110110110111 = 0x104C11DB7
011000010110001001100011
reverse bits in each byte:
100001100100011011000110
append 32 0 bits:
10000110010001101100011000000000000000000000000000000000
XOR the first 4 bytes with 0xFFFFFFFF:
01111001101110010011100111111111000000000000000000000000
'CRC division':
01111001101110010011100111111111000000000000000000000000
100000100110000010001110110110111
---------------------------------
111000100010010111111010010010110
100000100110000010001110110110111
---------------------------------
110000001000101011101001001000010
100000100110000010001110110110111
---------------------------------
100001011101010011001111111101010
100000100110000010001110110110111
---------------------------------
111101101000100000100101110100000
100000100110000010001110110110111
---------------------------------
111010011101000101010110000101110
100000100110000010001110110110111
---------------------------------
110101110110001110110001100110010
100000100110000010001110110110111
---------------------------------
101010100000011001111110100001010
100000100110000010001110110110111
---------------------------------
101000011001101111000001011110100
100000100110000010001110110110111
---------------------------------
100011111110110100111110100001100
100000100110000010001110110110111
---------------------------------
110110001101101100000101110110000
100000100110000010001110110110111
---------------------------------
101101010111011100010110000001110
100000100110000010001110110110111
---------------------------------
110111000101111001100011011100100
100000100110000010001110110110111
---------------------------------
10111100011111011101101101010011
remainder: 0b10111100011111011101101101010011 = 0xBC7DDB53
XOR the remainder with 0xFFFFFFFF:
0b01000011100000100010010010101100 = 0x438224AC
reverse bits:
0b00110101001001000100000111000010 = 0x352441C2
thus the CRC-32 hash for the ASCII string 'abc' is 0x352441C2
참고URL : https://stackoverflow.com/questions/2587766/how-is-a-crc32-checksum-calculated
'IT story' 카테고리의 다른 글
Flask에 저장하지 않고 파일 데이터 읽기 (0) | 2020.09.16 |
---|---|
CSS에서! important 속성을 사용하는 경우 (0) | 2020.09.16 |
보기를 빠르게 테마로 지정하는 방법은 무엇입니까? (0) | 2020.09.16 |
openssl에서 -nodes 인수의 목적은 무엇입니까? (0) | 2020.09.16 |
오디오 녹음을위한 Android AudioRecord 대 MediaRecorder (0) | 2020.09.16 |