CRCチェックサムとは?
巡回冗長検査(CRC:Cyclic Redundancy Check)は、ネットワーク通信やストレージ、各種ファイル形式(Ethernet、ZIP、PNG、Modbus、USBなど)で広く使われている誤り検出符号です。データを一つの長い2進数とみなし、あらかじめ決められた生成多項式で、桁上がりのない2進演算(GF(2):加算も減算もXORで行う)を使って割り算します。その割り算の余りがCRCの値です。メッセージのたった1ビットが変化しただけでも、余りはほぼ確実に変わります。これこそが、CRCが通信エラーやデータ破損の検出に優れている理由です。
この計算ツールの使い方
入力欄に任意のASCIIテキストを入力し、使用したいCRCの種類を選ぶと、結果が表示されます。チェックサムは16進数と10進数の両方で表示され、あわせてビット幅と処理したバイト数も確認できます。対応している代表的な3種類は次のとおりです。
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.$$
計算の仕組み
概念的には、メッセージ \(M(x)\) に \(x^n\)(\(n\) は生成多項式の次数)を掛け、それを生成多項式 \(G(x)\) で割ります。実際の処理では、1ビットずつシフトするレジスタを用い、先頭ビットが1のときに多項式をXORで取り込んでいきます。CRC-32のような反転(リフレクト)バリアントでは、ビットを下位ビットから処理し、左ではなく右へシフトします。
$$\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}_{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}_{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.$$
計算例
定番の検証用文字列 123456789 の場合、CRC-16/CCITT-FALSE は 0x29B1(10進数で \(10673\))、CRC-32/IEEE は 0xCBF43926(10進数で \(3421780262\))を返します。これらはCRCのリファレンスカタログに掲載されている標準的な「チェック値(check)」なので、自作の実装が正しく動作しているかを照合する基準として利用できます。
よくある質問
他のツールと結果が違うのはなぜ? CRCのバリアントは、多項式・初期値・ビット反転の有無・最終XORがそれぞれ異なります。比較する際は、まったく同じバリアント同士であることを必ず確認してください。
CRCは安全なハッシュとして使える? いいえ。CRCは偶発的なエラーを検出できますが、意図的に偽造するのは簡単です。セキュリティ用途にはSHA-256などを使用してください。
どの文字エンコーディングが使われる? 各文字は、CRCを計算する前に8ビットのASCII/Latin-1のバイト値として扱われます。