チェックサム(検査合計[1][2][3]: checksum)とは、語列の各語の総計を利用した誤り検出符号の一種である。他の誤り検出符号と比べて信頼性は低いものの、単純計算[注釈 1]で99.6%以上の検出率があるうえに算術が簡単であることから、簡易な誤り検出に用いられる。

名称・用語編集

「検査合計」という名称は、検査合計の符号値そのものを指すこともある。

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

算術編集

算出方法は非常に簡単で、もっとも単純なものは語列の個々の語の総計 (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である。

意図的な改竄の例編集

元の語列を前述の「00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F」とする。

これとまったく別の語列「70 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00」の検査合計値は72であるが、最後のバイトを「00」から「06」にすれば元の語列と同一の検査合計「78」となる。こうして、意図的に検査合計の整合性を取ることができた。もしもある一連の語列処理機構が受け取った語列の正当性を検査合計でのみ保証していた場合、この機構は該語列を元の語列として(誤)認識してしまうことになる。

脚注編集

注釈編集

  1. ^ 1オクテットの検査合計の場合28 − 1/280.996094、2オクテットなら216 − 1/2160.999985
  2. ^ もっとも、現在の暗号解読技術の前ではCRCやMD5はもはやちょっと高級な検査合計程度の信頼性しかないという意見もある[要出典]

出典編集

  1. ^ JIS X 9204:2004「高精細カラーディジタル標準画像 (XYZ/SCID)」3節「定義」1項
  2. ^ JIS X 0008:1997「情報処理用語—セキュリティ」(旧)用語番号08.03.05
  3. ^ JIS TR X 0055:2002「インターネット利用者のための用語」(公布期間外)用語番号2.18

関連項目編集