Loading article…
BSDチェックサム アルゴリズムは、一般的に使用されているレガシーチェックサムアルゴリズムです。古いBSDに実装されており、 sumコマンドライン ユーティリティからも利用できます。
このアルゴリズムはセキュリティの観点からは役に立たず、エラー検出に関してはCRC-32 cksumよりも弱いです。[1] [2]
BSDチェックサムの計算
以下は、 GNU sum ソース コード ( GPLライセンス)の関連部分です。入力データ ストリームのすべてのバイト (8 ビット ワード) を加算して、16 ビットのチェックサムを計算します。単純にデータを加算することの多くの弱点を回避するために、チェックサム アキュムレータは、新しい文字が追加される前に、各ステップで 1 ビットずつ右に循環回転されます。
int bsdChecksumFromFile ( FILE * fp ) /* 入力データのファイルハンドル */ { int checksum = 0 ; /* チェックサム mod 2^16. */
for ( int ch = getc ( fp ); ch != EOF ; ch = getc ( fp )) { checksum = ( checksum >> 1 ) + (( checksum & 1 ) << 15 ); checksum += ch ; checksum &= 0xffff ; /* 範囲内に収めます。 */ } return checksum ; }
アルゴリズムの説明
前述のように、このアルゴリズムはデータをセグメント化し、各合計の間で循環右シフトされるアキュムレータに追加することでチェックサムを計算します。アキュムレータを戻り値の範囲内に保つために、1 によるビット マスクが行われます。
例: 4 ビット サイズのセグメントを使用して 4 ビット チェックサムを計算する (ビッグ エンディアン)
入力: 101110001110 -> 3 つのセグメント: 1011、1000、1110。
反復1:
セグメント: 1011 チェックサム: 0000 ビットマスク: 1111
a) チェックサムに循環シフトを適用します。
0000 -> 0000
b) チェックサムとセグメントを加算し、得られた結果にビットマスクを適用します。
0000 + 1011 = 1011 -> 1011 & 1111 = 1011
反復2:
セグメント: 1000 チェックサム: 1011 ビットマスク: 1111
a) チェックサムに循環シフトを適用します。
1011 -> 1101
b) チェックサムとセグメントを加算し、得られた結果にビットマスクを適用します。
1101 + 1000 = 10101 -> 10101 & 1111 = 0101
反復3:
セグメント: 1110 チェックサム: 0101 ビットマスク: 1111
a) チェックサムに循環シフトを適用します。
0101 -> 1010
b) チェックサムとセグメントを加算し、得られた結果にビットマスクを適用します。
1010 + 1110 = 11000 -> 11000 & 1111 = 1000
最終チェックサム: 1000
参考文献
出典
- 公式 FreeBSD sum ソースコード
- 公式 GNU sum マニュアル ページ
- GNU sum ソースコード
