チェックサム

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

チェックサム (Check Sum)とは誤り検出符号の一種である。符号値そのものを指すこともある。他の誤り検出符号と比べて信頼性は低いが、それでも単純計算で99.5%以上(1オクテットのチェックサムの場合255/256、2オクテットなら65535/65536)の検出率がある上にアルゴリズムが簡単であることから、簡易な誤り検出に用いられる。

また、誤り検出その他データの検証のための符号として広く使われてきた経緯から、俗に誤り検出符号自体の代名詞としても用いられる場合がある。例えばCRCの符号値やMD5のハッシュ値を、それぞれ「CRCチェックサム」「MD5チェックサム」と呼ぶことがある。これらはアルゴリズムが異なりsumでもないため「チェックサム」と呼ぶことは、語義的には正確ではないものの、「(チェックサムよりも)信頼性の高い誤り検出符号」程度の意味で使われる。

アルゴリズム

算出方法は非常に簡単で、もっとも単純なものは、ワード列の個々のワードの総計(sum)の下位1ワードをそのまま符号値とするものであり、1ワードを何ビットとするかは実装によって異なる。

例えば、8ビットのワード列「00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F」の総和は「78」であるので、そのチェックサムは「78」となる。

総計のどのビット群を符号値とするか、符号値をどのように扱うかなどで、派生した種類がある。

ネットワークを利用してのデータ送信時、IPパケットにデータを分割した際のIPヘッダの検査での利用例を以下に示す。

  1. IPヘッダのチェックサムフィールドにゼロをセット
  2. IPヘッダを16ビット単位で加算
  3. 総計の下位16ビットの補数をIPヘッダのチェックサムフィールドへセット
  4. 送信
  5. 受信したらIPヘッダを16ビット単位で加算
  6. 総計がゼロなら正常(チェックサムフィールドにはチェックサムフィールドがゼロの場合のチェックサムの補数がセットされているので、総計=チェックサムフィールド以外のチェックサム+チェックサムフィールド以外のチェックサムの補数=ゼロになれば正しい

信頼性

単純な加算であるため、ワードを保持したまま列の順序のみ変化した場合には同じ値を示す。また、それ以外の誤りに対しても、符号値が同じになる確率は決して低くなく、誤り検出の方式としての信頼性は高くない。

またチェックサムをはじめとする誤り検出符号ハッシュ関数と異なり、暗号化や改ざん防止技術の用途は考慮されていない。そのため偶発的な誤りに対する耐性を高めるだけであり、意図的な改竄(チェックサムは同じで異なる内容にする)に対する耐性はない。特にチェックサムは単純な加算であることから、同じ符号値になる異なる内容を探すことがいかにも容易である。

例えば、前述のワード列(→#アルゴリズム)の前半後半を入れ替えた列「08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07」も、チェックサムは同じ「78」となってしまう。また全く別のバイト列「70 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00」のチェックサムは「72」であるが、これを「78」にするには最後のバイトを「00」→「06」にするなど、意図的にチェックサム整合性を取ることが簡単である。


関連