1

チェックサムアルゴリズムに取り組んでいますが、いくつか問題があります。キッカーは、受信している「実際の」データよりも大幅に小さい「偽の」メッセージを手作りすると、正しいチェックサムが得られることです。ただし、実際のデータに対しては、チェックサムが正しく機能しません。

着信データ/環境に関する情報を次に示します。

  • これはグルーヴィーなプロジェクトです (以下のコードを参照)
  • チェックサムの計算では、すべてのバイトが符号なし整数として扱われます
    • それを機能させるために、ショートパンツとロングパンツを少し調整することに気付くでしょう.
  • 実データのサイズは 491 バイトです。
  • サンプル データ (正しく追加されているように見える) のサイズは 26 バイトです。
  • 私が知る限り、16 進数から 10 進数への変換で負の数が生成されることはありません
  • ファイル内の一部のバイトはチェックサムに追加されません。これらのスイッチが適切に機能していること、およびそれが想定されている場合であることを確認しました-したがって、それは問題ではありません.
  • 私が計算したチェックサムと、実際の送信に同梱されているチェックサムは、常に同じ量だけ異なります。
  • 実際のデータと一緒にパッケージ化されたチェックサムが正しいことを手動で確認しました。

コードは次のとおりです。

// add bytes to checksum
public void addToChecksum( byte[] bytes) {
    //if the checksum isn't enabled, don't add
    if(!checksumEnabled) {
        return;
    }

    long previouschecksum =  this.checksum;

    for(int i = 0; i < bytes.length; i++) {
        byte[] tmpBytes = new byte[2];
        tmpBytes[0] = 0x00;
        tmpBytes[1] = bytes[i];

        ByteBuffer tmpBuf = ByteBuffer.wrap(tmpBytes);

        long computedBytes = tmpBuf.getShort();
        logger.info(getHex(bytes[i]) + " = " + computedBytes);
        this.checksum += computedBytes;
    }

    if(this.checksum < previouschecksum) {
        logger.error("Checksum DECREASED: " + this.checksum);
    }
    //logger.info("Checksum: " + this.checksum);
}

このアルゴリズムで、予想される結果からのずれを引き起こしている可能性のあるものを誰かが見つけた場合は、これを追跡するためにあなたの助けをいただければ幸いです.

4

2 に答える 2

0

チェックサムは、負になるまで増加し続けます (符号付き長整数であるため)。

メソッドを次のように短縮することもできます。

public void addToChecksum( byte[] bytes) {
  //if the checksum isn't enabled, don't add
  if(!checksumEnabled) {
    return;
  }

  long previouschecksum =  this.checksum;
  this.checksum += bytes.inject( 0L ) { tot, it -> tot += it & 0xFF }

  if(this.checksum < previouschecksum) {
    logger.error("Checksum DECREASED: " + this.checksum);
  }
  //logger.info("Checksum: " + this.checksum);
}

しかし、それはそれがマイナスに転じるのを止めることはありません。ハッシュを生成するアイテムごとに 12 バイトを節約するために、MD5 のような動作することがわかっているものをお勧めしますに固執する...

于 2011-09-07T20:31:43.773 に答える
0

コードにthis.checksum.

このようにして、常に を取得する必要がありますよthis.checksum > previouschecksumね? これは意図したものですか?

そうしないと、上記のコードに欠陥が見つかりません。「this.checksum」のタイプが間違っている可能性があります(たとえば、短い)。これにより、負の値が得られるようにロールオーバーする可能性があります。

これはそのような動作の例です

import java.nio.ByteBuffer
short checksum = 0
byte[] bytes = new byte[491]
def count = 260
for (def i=0;i<count;i++) {
    bytes[i]=255
}
bytes.each { b ->
    byte[] tmpBytes = new byte[2];
    tmpBytes[0] = 0x00;
    tmpBytes[1] = b;
    ByteBuffer tmpBuf = ByteBuffer.wrap(tmpBytes);
    long computedBytes = tmpBuf.getShort();
    checksum += computedBytes
    println "${b} : ${computedBytes}"
}
println checksum +"!=" + 255*count

入力の長さに何らかの形で対応する「count」変数の値をいじってみてください。

于 2011-09-07T19:30:28.090 に答える