ByteScope

CRC Calculator

入力ひとつに対して公表されている 113 種、そして使われている一種を名指しする探索。

バイト列はブラウザから出ません。計算はすべてこのページの中です。

入力

9 バイト先頭バイト:31 32 33 34 35 36 37 38 39

自分のパラメータ

Rocksoft モデルの6つの数値。CRC を説明しているデータシートは、たいていこの順でこの6つを書いています。名前は書いていないことも多い。

結果

—

「123456789」に対する check

—

公表されている CRC は必ずこの値を書いています。データシートの check と一致すれば、上の6つはその文書が言っているアルゴリズムそのものです。左の結果を信じるのはそのあとで。

名前のある CRC 全部

入力ひとつに対して、公表されている 113 種を一度に計算します。手元のチェックサムと一致する行が、探しているアルゴリズムです。

0 種

その条件に合うアルゴリズムはありません。

チェックサムから逆に辿る

フレームとそれが載せているチェックサムはあるのに、どの CRC で作られたかはどこにも書いていない。フレームを上の入力に、チェックサムをここに入れれば、探索が答えます。

上のバイト列に対して、機器やファイルが実際に載せている値です。

一致: 0

公表されている 113 モデルの先は、8ビットの多項式を全部、次に16ビットを全部試します。init と xorout はそれぞれ全0か全1、反転は両方。16ビットより広い幅は総当たりしません。40億通りの多項式は、ブラウザのタブが終えられる探索ではありません。

CRC 以外のチェックサム

末尾のバイトが必ず CRC とはかぎりません。世の中のプロトコルの残り半分が実際に使っているのはこの8つで、同じ入力に対して計算しています。

チェックサム16進10進
sum8バイトを足して 8 ビットに丸めたもの。——
sum16バイトを足して 16 ビットに丸めたもの。——
xor8全バイトの XOR。Modbus ASCII と NMEA の LRC。——
fletcher16mod 255 の走行和が2本。並び替えると値が変わります。——
fletcher32同じ考えを16ビットのリトルエンディアン語に、mod 65535 で。——
adler32Fletcher の親戚、mod 65521。zlib ストリームの末尾にいます。——
internetChecksumRFC 1071。16ビットのビッグエンディアン語の1の補数和の、さらに1の補数。IP・UDP・TCP のヘッダ。——
bsdChecksum右に1ビット回してから足す。BSD の sum(1) が出す値。——

NMEA 0183 センテンス

チェックサム—

先頭の $ または ! と * の間にある文字を全部 XOR します。これだけは上のバイト列ではなくセンテンスを取ります。規格がそう定めているからです。

このツールについて

フレーム末尾の2バイト

プロトコルのダンプが 4b 37 で終わっていて、渡された資料には「CRC-16」としか書いていない。それはアルゴリズム名ではなく一族の名前です。公表されている16ビット CRC は何十種類もあり、多項式・初期値・ビット順・最後の XOR が違い、違うものを選ぶと、間違ったという合図なしに間違った答えが出ます。だからこのページは選ばせません。フレームをテキストでも16進ダンプでもファイルでも貼れば、CRC-3/GSM から CRC-82/DARC まで公表されている 113 種を一度に計算します。手元のバイト列と一致する行が見つかれば、名前ごと答えが出たことになります。

CRC を決める6つの数

データシートが CRC をきちんと書いているときは、Rocksoft モデルで書いています。width、poly、init、refin、refout、xorout。それを入れれば結果がすぐ出ますが、隣にもう1つ、見た目より大事な数が出ます。check 値、つまりそのパラメータ自身が 123456789 の9文字に対して出す値です。公表されている CRC は必ずこれを書いていますし、まともなデータシートも書いています。ここの check が手元の文書の check と一致すれば、入れた6つの数はその文書が言っているアルゴリズムそのもので、左の結果はそこで初めて信用に値します。計算機と当てずっぽうの差はここです。

アルゴリズムを探す

名前がどれも合わず、データシートも存在しないなら、フレームとそれが載せているチェックサムを探索に渡してください。まず公表されている全モデルを試し、次に8ビットの多項式を全部、16ビットの多項式を全部、init と xorout は全0か全1、反転は両方の組み合わせで総当たりします。報告されたものは必ずあなたの標本を満たします。見落とすことはあっても、でっち上げることはありません。境界は隠さず書いてあります。16ビットより広い幅は総当たりしません。40億通りの多項式はブラウザのタブが終えられる探索ではないからです。64 KB を超える標本も受け付けません。本探索の前に、113 個の1ビットずつ回るエンジンが標本全体を舐めてしまうからです。逆引きは1メッセージ用で、ファームウェア1本分ではありません。

パケット末尾が必ず CRC とはかぎらない

もっと単純な何かで終わるプロトコルはいくらでもあり、「それはそもそも CRC ではない」と分かることも立派な答えです。同じ入力を CRC 以外の8種のチェックサムにも通します。sum8、sum16、xor8、fletcher16、fletcher32、adler32、RFC 1071 のインターネットチェックサム、そして BSD の sum(1) の右回転して足すやつ。さらに NMEA 0183 の欄は、規格がそう定めているのでバイト列ではなくセンテンスを取ります。全部このページの中の Web Worker で動きます。アップロードなし、アカウントなし、そのとき解析していたファームウェアについて誰かに説明する必要もなし。

よくある質問

「CRC-32」はどれのことですか?

たいていは CRC-32/ISO-HDLC です。zip、gzip、PNG、イーサネットのあれ。ただしこの名前は CRC-32 や CRC-32/ADCCP としても公表されていますし、CRC-32C と書いてあれば別物の CRC-32/ISCSI で、多項式からして違います。表には正式な reveng 名の隣に別名を全部並べてあるので、手元の資料の呼び方で検索して、それが実際に指すモデルに着地できます。

手元の機器と結果が合いません。だいたい何が原因ですか?

多項式であることはまずありません。原因はバイトの範囲です。チェックサムは端末に出ていないヘッダまで掛かっているか、長さフィールドを数に入れているか、思っているより1バイト手前で終わっています。次に多いのは反転で、refin と refout こそが CRC-16/ARC と CRC-16/XMODEM を分けています。掛かっていると思うバイト列そのもので逆引きを試してください。何も出てこないなら、変えるべきはアルゴリズムではなくバイト列です。

check 値は何のためにあり、なぜ何度も出てくるのですか?

ASCII 9文字 123456789 に対するそのアルゴリズムの値で、このページを信用しなくてもパラメータを検証できる唯一の数です。公表されている CRC は必ず書いています。パラメータを入れて、ここに出る check とデータシートに印刷されている check を比べれば、自分のデータを1バイトも使わないうちに、両方の文書が同じアルゴリズムを指していると確認できます。

なぜ逆引きはファームウェア1本を受け付けないのですか?

最初にやることが、公表されている 113 モデル全部を標本全体に対して回すことで、それは予算や中止が効くより前だからです。しかもエンジンは CRC-82/DARC のような幅でも正確であるように、あえて1ビットずつ回しています。64 KB ならその工程は2秒ほど、1 MB なら30秒ほどかかり、見た目はタブが固まったのと区別がつきません。上限は 64 KB で、拒否は探索が始まる前に起きます。大きいファイルの CRC を計算するのは問題ありません。それが上の表で、あちらは一度に1アルゴリズムです。

改ざんの検出に CRC は使えますか?

使えませんし、そういう用途のものではありません。CRC が見つけるのは偶発的な壊れ方——線上で反転した1ビット、フラッシュの不良ブロック——で、それは非常に得意です。線形なので、データを書き換えられる人は末尾を計算し直すことも、元の値に戻す余分なビットを求めることもできます。相手がノイズの多いケーブルではなく人間なら、必要なのは暗号学的ハッシュ、ファイルごと差し替えられうるなら MAC です。