IT用語集

CRCとは? 10分でわかりやすく解説

水色の背景に六角形が2つあるイラスト 水色の背景に六角形が2つあるイラスト
アイキャッチ
目次

CRC(Cyclic Redundancy Check)は、デジタルデータの伝送や保存の過程で混入する誤りを検出するための仕組みです。通信、ストレージ、組み込み機器など、データ整合性を確認する場面で使われます。CRCは誤り検出に向く一方、誤り訂正や悪意ある改ざん対策を目的とした仕組みではありません。設計時は、CRC長、生成多項式、初期値、反射、最終XOR、エラー検出後の処理まで含めて決める必要があります。

  • 何をする仕組みか:データに付けたCRC値を使い、伝送や保存の途中で生じた誤りを検出する
  • 何ができて何ができないか:誤りの検出には向くが、訂正や暗号学的な改ざん対策には向かない
  • どこで使われるか:通信、ストレージ、組み込み機器など、データ整合性の確認が必要な場面で使われる

CRCとは何か

CRC(Cyclic Redundancy Check)とは、デジタルデータの伝送や保存の際に発生する誤りを検出する技術です。チェック用の冗長情報であるCRC値をデータに付与し、受信側または読み出し側で同じ条件の計算を行って整合性を確認します。

CRCは「誤りが混入した可能性」を高い確率で見つけるための仕組みです。通信やストレージでは、ノイズ、媒体劣化、一時的なビット化け、転送経路上の異常などにより、データが変化する場合があります。CRCは、こうした偶発的な誤りを検出するために使われます。

CRCの定義と概要

CRCでは、送信するデータに対してあらかじめ決めた規則でCRC値を計算し、そのCRC値をデータに付加します。受信側は受け取ったデータに対して同じ規則で計算し、結果が想定どおりかどうかを確認します。計算結果に矛盾がなければ誤りは検出されなかったと判断し、矛盾があれば誤りが混入したと判断します。

ここで重要なのは、CRCが保証するのは「誤りの検出」であって、「誤りがないことの証明」ではない点です。CRCは検出能力の高い方式ですが、生成多項式、CRC長、データ長、誤りパターンによっては未検出となる可能性が残ります。実務では、誤りを完全になくす仕組みではなく、未検出リスクを十分に小さくするための技術として扱います。

CRCの主な特徴は以下の通りです。

  1. 誤りを高い確率で検出できる
  2. バースト誤りへの検出能力を持たせやすい
  3. 計算が比較的単純で、ハードウェア実装に向く
  4. データサイズに対して付加する冗長情報を抑えやすい

CRCは、偶発的な誤りの検出を目的とした仕組みです。単純なチェックサムより誤り検出能力を高めやすい一方、メッセージ認証コードやデジタル署名のように、悪意ある改ざんへの耐性を目的とした仕組みではありません。

CRCの仕組みと原理

CRCは、ビット列を多項式として扱い、生成多項式で割った余りをCRC値として使う考え方で説明されます。実装では、通常の割り算をそのまま行うのではなく、XOR演算を用いたシフトレジスタ処理として実現されることが一般的です。

一般的な計算の流れは次のとおりです。

  1. 送信データをビット列として表現する
  2. あらかじめ決めた生成多項式を用いて計算する
  3. 計算結果として得られた余りをCRC値としてデータに付加する
  4. 受信側で同じ生成多項式と同じ条件で計算し、矛盾がないかを確認する

CRC多項式は、誤り検出性能に直結します。ただし、多項式だけではCRC仕様は確定しません。初期値、入力ビットの反射、出力ビットの反射、最終XOR、CRC値の格納順などの条件も一致していなければ、送受信側で計算結果が合いません。

実務では、多項式は同じでも、初期値や反射条件が異なるために検証に失敗するケースがあります。仕様書や実装では、CRC名だけでなく、計算条件を明記する必要があります。

CRCの種類と特徴

CRCには、生成多項式やCRC長によって複数の種類があります。代表的な名前としてCRC-16、CRC-32などがありますが、名称が同じでも初期値や反射条件が異なる派生が存在します。仕様書や実装例を読むときは、単に「CRC-16」と書かれているかではなく、どの派生を指すのかを確認します。

CRC-16/ARC0x8005多項式を使う代表的な16ビット系CRC。初期値、反射条件、最終XORなどを含めて仕様を確認する必要がある。
CRC-3232ビットCRC。通信、圧縮形式、ファイル形式などで広く使われる。多項式が同じでもビット順や初期値により結果が変わる。
CRC-16/CCITT系0x1021多項式を使う16ビット系CRC。初期値や反射条件が異なる複数の派生がある。

CRC長が長いほど、一般にランダム誤りに対する未検出確率を下げやすくなります。ただし、CRCの性能はCRC長だけで決まりません。生成多項式の選択、データ長、想定する誤りモデル、実装条件がセットで影響します。単発ビット誤りが多いのか、連続したバースト誤りが多いのかなど、用途に合わせて選ぶことが基本です。

CRCの利点と欠点

CRCの利点は以下の通りです。

  • 誤り検出能力が高い
  • 設計によりバースト誤りへの検出能力を確保しやすい
  • 計算が比較的単純で、ハードウェア実装に向く
  • 付加する冗長情報が小さく、帯域や容量への影響を抑えやすい

一方で、欠点や誤解されやすい点もあります。

  • 誤りの訂正はできない
  • 仕様・実装条件が一致しないと検証に失敗する
  • 悪意ある改ざんの検出を目的とした仕組みではない
  • データ量や処理条件によっては計算方式の選択が必要になる

CRCは誤り検出に適した技術ですが、誤り訂正が必要な場面ではFEC(前方誤り訂正)や再送制御(ARQ)などを検討します。セキュリティ目的でデータの完全性を守る場合は、CRCではなく、メッセージ認証コードやデジタル署名などの暗号学的な方式を使います。

CRCの用途と応用

通信システムにおけるCRCの役割

通信システムでは、伝送中のノイズ、干渉、ハードウェアの一時的な不調などによってビット誤りが起きる場合があります。CRCは、こうした誤りが混入した可能性を受信側で検出し、フレームやメッセージを破棄・再送する判断材料として使われます。

例えば、EthernetやWi-Fiでは、フレーム末尾のFCS(Frame Check Sequence)としてCRCが使われます。受信側は計算結果を照合し、誤りが検出されたフレームを破棄します。

通信でCRCが使われる理由は、検出能力と実装容易性のバランスがよいためです。高速リンクでは、CPUで逐次計算するのではなく、NICや通信ICがハードウェアでCRCを計算し、通信速度に合わせて処理する構成が一般的です。

データストレージにおけるCRCの活用

ストレージ分野では、書き込み時と読み出し時でデータが一致しているかを確認するためにCRCが使われます。媒体劣化、転送エラー、メモリ内の一時的なビット化けなど、保存・読み出しの過程でも誤りが起きる可能性があるためです。

CRCは、壊れたデータを上位処理に渡す前に検出するための仕組みとして機能します。ただし、CRC自体は破損したデータを復旧しません。RAIDなどの冗長化は失われたデータを復元するための仕組みであり、CRCはデータ破損を検出するための仕組みです。両者は目的が異なるため、併用される場合があります。

組み込みシステムでのCRCの実装

組み込みシステムでは、限られたCPU性能、メモリ、電力の中で高い信頼性が求められます。センサー値の受け渡し、制御メッセージ、ファームウェア更新、ログ保存など、誤りが大きな影響につながる場面では、CRCによる整合性確認が有効です。

組み込みでCRCを実装する際は、CRCを付けるだけでは不十分です。どこで計算し、どこで検証し、誤り検出時にどう処理するかを決めます。破棄、再送、再取得、フェイルセーフへの移行など、検出後の処理を設計しておかなければ、CRCの検出結果を運用に活かせません。

組み込みシステムでCRCを実装する際の注意点は、次のように整理できます。

  • メモリ使用量と計算負荷を考慮し、CRC長と生成多項式を選ぶ
  • 可能であればハードウェアCRC機能を使い、処理負荷を抑える
  • 初期値、反射、最終XORなどの条件を仕様として固定し、実装を統一する
  • テストデータを用意し、既知の入力と期待CRC値で実装を検証する

ネットワークプロトコルとCRC

ネットワークプロトコルでは、フレームやメッセージ単位でCRCを持ち、下位層で誤りを検出する構成が採用されることがあります。ただし、どの層がどの種類のチェックを持つかはプロトコル設計によって異なります。下位層でCRCを使っているからといって、上位層の整合性確認が不要になるわけではありません。

Ethernetフレームの整合性確認にFCSを使い、受信側で誤り検出と破棄判断を行う。
TCP/IPプロトコルによりチェック方式が異なる。CRCではなくチェックサムが中心の領域もある。
Modbusメッセージの整合性確認にCRCを使う方式がある。

CRCは通信、ストレージ、組み込みといった幅広い領域で、データ整合性の確認に使われます。ただし、どの誤りをどの程度の確率で検出したいのか、検出した後にどう処理するのかを決めておかないと、期待した効果は得にくくなります。

CRCの計算方法

CRCアルゴリズムの基本

CRC計算の基本は、データをビット列として扱い、生成多項式に基づく演算を行って余りを求めることです。送信側はその余りをCRC値として付与し、受信側は同じ条件で計算して整合性を確認します。

実装上は、シフトレジスタとXOR演算を用いた逐次処理として表現されることが多くあります。ビット単位で計算する方法と、バイト単位でテーブル参照により高速化する方法があります。どの方式を採用するかは、処理速度、メモリ、電力、実装コストなどの制約で決まります。

生成多項式の選択と影響

CRCの性能は、生成多項式の選択に大きく依存します。一般に、次数、つまりCRC長が大きいほど、ランダム誤りに対する未検出確率を下げやすくなります。ただし、誤り検出能力の得意・不得意は多項式の性質にも左右されます。特にバースト誤りへの検出能力は、多項式選択の影響を受けます。

また、多項式の選択と同じくらい重要なのが、以下の実装パラメータです。

  • 初期値(初期レジスタ値)
  • 入力ビットの反射(RefIn)と出力ビットの反射(RefOut)
  • 最終XOR(XorOut)
  • CRCを付加する位置やエンディアン(バイト順)

名称だけで「CRC-32を使っている」と表現しても、これらの条件が違えば結果は一致しません。仕様として固定し、実装間でぶれないようにすることが、トラブル防止につながります。

ハードウェアとソフトウェアでのCRC計算

CRC計算は、ハードウェアでもソフトウェアでも実装できます。ハードウェア実装は、通信IC、MCUの周辺回路、NICなどがCRC機能を持つ場合に有効で、処理速度の確保やCPU負荷低減につながります。

ソフトウェア実装は、プラットフォーム依存を抑えやすく、仕様変更にも対応しやすい一方、処理速度や消費電力が課題になる場合があります。

実務では、まずソフトウェアで正しさを検証し、必要に応じてハードウェア支援を使う方法が採用しやすくなります。いずれの方式でも、同一条件で同一結果が得られるかを、既知のテストベクトルで確認します。

CRCの最適化技術

CRC計算の速度や効率を高めるために、複数の最適化手法が使われます。代表例は次のとおりです。

  • テーブルルックアップ方式:事前計算テーブルを使い、バイト単位でCRCを更新する
  • スライシング方式:複数テーブルを使い、より大きな単位で処理する
  • 並列処理:ハードウェアやSIMD命令などを活用し、処理を並列化する
  • ハードウェアアクセラレーション:MCU内蔵のCRCユニットなどを使い、CPU負荷を抑える

最適化では、速度だけでなく、コードサイズ、メモリ使用量、テーブルの初期化コスト、実装の複雑さも評価します。通信速度、フレームサイズ、MCU性能などの要件に合わせて方式を選びます。

CRCは、多項式、実装条件、計算方式の組み合わせで成立します。用途に応じて検出性能と実装コストのバランスを取りながら設計することで、整合性チェックとして機能します。

CRC設計・運用の実務ポイント

CRC設計上の留意点

CRCを設計・導入する際は、何を検出したいのかを先に定義します。通信であれば誤りが混入したフレームを破棄できること、ストレージであれば読み出し時に破損を検知できること、組み込みであればフェイルセーフにつなげられることなど、目的により設計の焦点が変わります。

  • 用途に合ったCRC長と生成多項式を選択する
  • 初期値、反射、最終XOR、バイト順などの条件を仕様として固定する
  • エラー検出時の処理(破棄、再送、冗長系切替など)を決めておく
  • 互換性が必要な場合は、既存規格や相互接続先の実装条件に合わせる
  • テストベクトルを用意し、実装が正しいことを継続的に検証できるようにする

適切なCRC設計は、検出性能だけでなく、運用時の切り分けや再発防止にも関係します。例えば、ログにCRC不一致を残して原因分析につなげる、再送回数の閾値を設ける、といった運用面まで含めて整理します。

CRCの検出能力と限界

CRCは高い誤り検出能力を持ちますが、万能ではありません。限界を理解したうえで、必要に応じて他方式と併用します。

  • 生成多項式や条件によって、検出できない誤りパターンが存在する
  • バースト誤りへの検出能力は多項式選択に依存する
  • 暗号学的な改ざん耐性は持たない
  • システム全体としての未検出リスクは、データ長、誤り率、運用条件の影響を受ける

通信品質が悪く誤りが多発する環境では、CRCだけでなく再送制御や冗長化設計を組み合わせる必要があります。悪意ある改ざん対策が必要な場合は、CRCでは目的を満たせないため、メッセージ認証コードや署名などの別方式を選択します。

CRCと他のエラー検出手法の比較

CRC以外にも、誤り検出や訂正の方式は複数あります。比較の観点としては、検出能力、計算コスト、実装容易性、訂正の可否が代表的です。

CRC誤り検出能力が高い。ハードウェア実装もしやすい。誤り訂正はできない。
パリティ実装が簡単。検出能力は限定的で、複数ビット誤りを見逃す場合がある。
チェックサム実装が簡単でソフトウェア処理に向く。一般にCRCより検出能力は低い。
ハミング符号条件により誤り訂正が可能。設計と実装が比較的複雑になる。

実務では、リンク層でCRC、上位層でチェックサム、セキュリティ用途でメッセージ認証コードを使うなど、目的に応じて階層的に使い分けます。

CRCの効果的な導入例

CRCの効果を引き出すには、検出した後にどう扱うかまで設計しておく必要があります。代表的な活用例は以下の通りです。

  • 通信システム:フレーム末尾にCRCを付加し、誤り検出時はフレームを破棄して再送制御につなげる
  • ストレージシステム:書き込み時にCRCを記録し、読み出し時に照合して破損データの利用を防ぐ
  • 組み込みシステム:センサー値や制御メッセージにCRCを付け、異常検知時はフェイルセーフや再取得へ切り替える

CRCは、誤りが混入したデータをそのまま処理しないための基本部品として有効です。適切な多項式と実装条件を選び、テストと運用設計まで含めて導入することで、システム全体の信頼性を高めやすくなります。

CRCを導入・運用する前に確認すること

CRCを使う際は、まず検出したい誤りの種類と、検出後の処理を決めます。偶発的な通信誤りを検出したいのか、保存データの破損を検知したいのか、組み込み機器の制御メッセージを確認したいのかによって、適切なCRC長、生成多項式、実装方式が変わります。次に、初期値、反射、最終XOR、バイト順を仕様として固定し、テストベクトルで実装の一致を確認します。CRCは誤り検出の仕組みであり、誤り訂正や改ざん対策は別の方式で補う必要があります。

Q.CRCはエラーを直すこともできますか

A.できません。CRCは誤りを見つけるための仕組みであり、訂正は再送制御やFECなど別の方式で行います。

Q.CRCが一致すればデータが絶対に正しいといえますか

A.絶対とはいえません。未検出の可能性は残るため、未検出確率を十分に小さくするよう多項式と条件を選びます。

Q.CRC-16とCRC-32は何が違いますか

A.付加するCRC長が異なります。一般にCRC-32の方が未検出確率を下げやすい一方、付加ビット数や計算条件の確認が必要です。

Q.同じCRC-16でも結果が合わないことはありますか

A.あります。初期値、反射、最終XOR、バイト順などが異なると、同じ多項式でも結果は一致しません。

Q.CRCは暗号の代わりになりますか

A.代わりにはなりません。CRCは偶発的な誤りの検出が目的であり、悪意ある改ざんへの耐性は想定していません。

Q.CRC多項式はどうやって選べばいいですか

A.想定する誤りモデルと互換性要件に合わせて選びます。相互接続がある場合は、規格や相手実装の条件に合わせます。

Q.ハードウェアCRCとソフトウェアCRCはどちらが良いですか

A.速度や電力が厳しい場合はハードウェア支援が有利です。移植性や仕様変更への追従を重視する場合はソフトウェア実装が扱いやすい場合があります。

Q.CRC計算を高速化する方法はありますか

A.テーブル参照方式、スライシング方式、SIMD命令、ハードウェア支援などを使えます。メモリやコードサイズとのバランスで選びます。

Q.通信でCRC不一致が出たらどうすべきですか

A.基本は破棄や再送など、設計済みのエラー処理に従います。再送増加、ドロップ、物理層の品質なども確認します。

Q.実装が正しいか確認する方法はありますか

A.既知の入力と期待値を用いたテストベクトルで検証します。多項式、初期値、反射、最終XORなどを固定したうえで確認します。

記事を書いた人

ソリトンシステムズ・マーケティングチーム