CRC рдЪреЗрдХрд╕рдо рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
Cyclic Redundancy Check (CRC) рдПрдХ рдРрд╕рд╛ рдПрд░рд░-рдбрд┐рдЯреЗрдХреНрдЯрд┐рдВрдЧ рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ, рд╕реНрдЯреЛрд░реЗрдЬ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдлрд╝реЙрд░реНрдореИрдЯ (Ethernet, ZIP, PNG, Modbus, USB рд╡рдЧреИрд░рд╣) рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд▓рдВрдмреА рдмрд╛рдЗрдирд░реА рд╕рдВрдЦреНрдпрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬрдирд░реЗрдЯрд░ рдкреЙрд▓рд┐рдиреЛрдорд┐рдпрд▓ рд╕реЗ рдХреИрд░реА-рд░рд╣рд┐рдд рдмрд╛рдЗрдирд░реА рдЕрдВрдХрдЧрдгрд┐рдд (GF(2), рдЬрд╣рд╛рдБ рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛рд╡ рджреЛрдиреЛрдВ рд╣реА XOR рд╣реЛрддреЗ рд╣реИрдВ) рдХреЗ рдЬрд╝рд░рд┐рдП рднрд╛рдЧ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рднрд╛рдЧ рдХрд╛ рд╢реЗрд╖рдлрд▓ рд╣реА CRC рд╣реИред рдЕрдЧрд░ рдореИрд╕реЗрдЬ рдХрд╛ рдПрдХ рднреА рдмрд┐рдЯ рдмрджрд▓ рдЬрд╛рдП, рддреЛ рд╢реЗрд╖рдлрд▓ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ тАФ рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ CRC рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдФрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рдмреЗрд╣рдж рдХрд╛рд░рдЧрд░ рд╣реИред
рдЗрд╕ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреИрд╕реЗ рдХрд░реЗрдВ
рдЗрдирдкреБрдЯ рдмреЙрдХреНрд╕ рдореЗрдВ рдХреЛрдИ рднреА ASCII рдЯреЗрдХреНрд╕реНрдЯ рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХрд╛ CRC рд╡реИрд░рд┐рдПрдВрдЯ рдЪреБрдиреЗрдВ рдФрд░ рдирддреАрдЬрд╛ рджреЗрдЦреЗрдВред рдпрд╣ рдЯреВрд▓ рдЪреЗрдХрд╕рдо рдХреЛ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдФрд░ рдбреЗрд╕рд┐рдорд▓ рджреЛрдиреЛрдВ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдмрд┐рдЯ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕ рдХреА рдЧрдИ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рднреА рдмрддрд╛рддрд╛ рд╣реИред рддреАрди рдЖрдо рд╡реИрд░рд┐рдПрдВрдЯ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ:
CRC-8 тАФ рдкреЙрд▓рд┐рдиреЛрдорд┐рдпрд▓ \(\mathtt{0x07}\), рд╢реБрд░реБрдЖрддреА рдорд╛рди \(\mathtt{0x00}\)ред
CRC-16/CCITT-FALSE тАФ рдкреЙрд▓рд┐рдиреЛрдорд┐рдпрд▓ \(\mathtt{0x1021}\), рд╢реБрд░реБрдЖрддреА рдорд╛рди \(\mathtt{0xFFFF}\), рдХреЛрдИ рд░рд┐рдлрд╝реНрд▓реЗрдХреНрд╢рди рдирд╣реАрдВред
CRC-32 (IEEE 802.3) тАФ рд░рд┐рдлрд╝реНрд▓реЗрдХреНрдЯреЗрдб рдкреЙрд▓рд┐рдиреЛрдорд┐рдпрд▓ \(\mathtt{0xEDB88320}\), рд╢реБрд░реБрдЖрддреА рдорд╛рди \(\mathtt{0xFFFFFFFF}\), рдЕрдВрддрд┐рдо XOR \(\mathtt{0xFFFFFFFF}\)ред рдпрд╣реА рд╡реИрд░рд┐рдПрдВрдЯ ZIP, gzip рдФрд░ Ethernet рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрддрд╛ рд╣реИред
$$\text{CRC} = \mathrm{XorOut} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}_{\text{poly}}(\text{crc}, b)$$
$$\text{where (CRC-16/CCITT-FALSE)}\quad \left\{ \begin{aligned} \text{poly} &= \mathtt{0x1021} \\ \mathrm{init} &= \mathtt{0xFFFF} \\ \mathrm{XorOut} &= \mathtt{0x0000} \\ \text{width} &= 16 \text{ bits (MSB-first, no reflection)} \end{aligned} \right.$$
$$\text{CRC}_{8} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$
$$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0x00} \\ \text{poly} &= \mathtt{0x07} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 8 \text{ bits, MSB-first} \end{aligned} \right.$$
$$\text{CRC}_{16} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$
$$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFF} \\ \text{poly} &= \mathtt{0x1021} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 16 \text{ bits, MSB-first} \end{aligned} \right.$$
$$\text{CRC}_{32} = \mathtt{0xFFFFFFFF} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$
$$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFFFFFF} \\ \text{poly} &= \mathtt{0xEDB88320}\ (\text{reflected}) \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \gg 1\big) \oplus (\text{LSB}?\,\text{poly}:0) \\ \text{width} &= 32 \text{ bits, LSB-first} \end{aligned} \right.$$
рдлрд╝реЙрд░реНрдореВрд▓рд╛ рд╕рдордЭреЗрдВ
рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдореИрд╕реЗрдЬ \(M(x)\) рдХреЛ \(x^n\) рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд╣рд╛рдБ \(n\) рдЬрдирд░реЗрдЯрд░ рдХреА рдбрд┐рдЧреНрд░реА рд╣реИ) рдФрд░ рдлрд┐рд░ \(G(x)\) рд╕реЗ рднрд╛рдЧ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рдореЗрдВ рд╣рдо рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдПрдХ-рдПрдХ рдмрд┐рдЯ рдХрд░рдХреЗ рд╢рд┐рдлрд╝реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рднреА рдЕрдЧреНрд░рдгреА (leading) рдмрд┐рдЯ 1 рд╣реЛ, рддреЛ рдЙрд╕рдореЗрдВ рдкреЙрд▓рд┐рдиреЛрдорд┐рдпрд▓ XOR рдХрд░ рджреЗрддреЗ рд╣реИрдВред рд░рд┐рдлрд╝реНрд▓реЗрдХреНрдЯреЗрдб рд╡реИрд░рд┐рдПрдВрдЯ (рдЬреИрд╕реЗ CRC-32) рдмрд┐рдЯреНрд╕ рдХреЛ least-significant-first рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдПрдБ рдХреА рдмрдЬрд╛рдп рджрд╛рдПрдБ рд╢рд┐рдлрд╝реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рд╣рд▓ рдХрд┐рдпрд╛ рд╣реБрдЖ рдЙрджрд╛рд╣рд░рдг
рдХреНрд▓рд╛рд╕рд┐рдХ рдЪреЗрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ 123456789 рдХреЗ рд▓рд┐рдП: CRC-16/CCITT-FALSE рдХрд╛ рдирддреАрдЬрд╛ рд╣реЛрддрд╛ рд╣реИ 0x29B1 (рдбреЗрд╕рд┐рдорд▓ 10673), рдФрд░ CRC-32/IEEE рдХрд╛ рдирддреАрдЬрд╛ рд╣реЛрддрд╛ рд╣реИ 0xCBF43926 (рдбреЗрд╕рд┐рдорд▓ 3421780262)ред рдпреЗ CRC рд░реЗрдлрд╝рд░реЗрдВрд╕ рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдорд╛рдирдХ "check" рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрдирдХреЗ рдЬрд╝рд░рд┐рдП рдХрд┐рд╕реА рднреА рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╡рд╛рд▓
рдореЗрд░рд╛ рдирддреАрдЬрд╛ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдЯреВрд▓ рд╕реЗ рдЕрд▓рдЧ рдХреНрдпреЛрдВ рдЖ рд░рд╣рд╛ рд╣реИ? CRC рд╡реИрд░рд┐рдПрдВрдЯ рдкреЙрд▓рд┐рдиреЛрдорд┐рдпрд▓, рд╢реБрд░реБрдЖрддреА рдорд╛рди, рдмрд┐рдЯ рд░рд┐рдлрд╝реНрд▓реЗрдХреНрд╢рди рдФрд░ рдЕрдВрддрд┐рдо XOR рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВред рдкрдХреНрдХрд╛ рдХрд░ рд▓реЗрдВ рдХрд┐ рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╡реИрд░рд┐рдПрдВрдЯ рдЖрдкрд╕ рдореЗрдВ рддреБрд▓рдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдХреНрдпрд╛ CRC рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрд╢ рд╣реИ? рдирд╣реАрдВред CRC рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд╣реБрдИ рдЧрд▓рддрд┐рдпрд╛рдБ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмрджрд▓рдирд╛ (forge рдХрд░рдирд╛) рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП SHA-256 рдпрд╛ рдЗрд╕ рдЬреИрд╕реЗ рд╣реИрд╢ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред
рдХреМрди-рд╕реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрддреА рд╣реИ? CRC рдХреА рдЧрдгрдирд╛ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рдЕрдХреНрд╖рд░ рдХреЛ рдЙрд╕рдХреЗ 8-рдмрд┐рдЯ ASCII/Latin-1 рдмрд╛рдЗрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред