1

このコードを実行すると問題が発生します。このメソッドが返す値にアクセスしようとする瞬間まで、すべて正常に動作します。ランダムなバイト ハッシュを生成する必要があります。大きな for ループ (j カウンターを持つループ) にいる場合は正常に動作しますが、いったんそれがなくなると、arraylist 内のすべての値はそこに追加された最後の値になります。それが、rainbow.get(0).start と rainbow.get(1).start の system.out.prints です。

下部にも Chain クラスがあります。

これはどこでめちゃくちゃになっているのですか?

public static ArrayList<Chain> genRainBow(){
    byte[] constant = new byte[8];

    ArrayList<byte[]> hashRed = new ArrayList<byte[]>();
    ArrayList<byte[]> variations = new ArrayList<byte[]>();

    ArrayList<Chain> rnbow = new ArrayList<Chain>();

    //rainbow = new ArrayList<Chain>();
    //byte[] start;

    byte[] hash = null;
    int collision = 0;
    int allColl = 0;

    Random rnd = new Random();
    byte[] randomBytes = new byte[8];

    byte[] red;

    byte[] copyHash = null;

    for(int j = 0; j < 1000; j++){

        hashRed = new ArrayList<byte[]>();
        collision = 0;
        rnd.nextBytes(randomBytes);
        red = truncate12(randomBytes);
        byte[] start = red;




        for(int i = 0; i < 50; i++){
            //System.out.println(i + " " + DatatypeConverter.printHexBinary(red));
            hash = Main.DES(red, constant);
            //System.out.println( i + " " +DatatypeConverter.printHexBinary(hash));

            red = Main.reductionChain(hash, i);

            if(containsList(hashRed, hash))
                collision++;

            hashRed.add(hash);

            //rainbow.put(red, hash);

        }



        hash = red;
        rnbow.add(new Chain(start, hash));
    //    rainbow.add(new Chain(start, hash));

        System.out.println("STR" + DatatypeConverter.printHexBinary(rainbow.get(j).start));

        if(!containsList(variations, hash))
            variations.add(hash);

        System.out.println("Collision: " + collision);
        System.out.println();
        allColl += collision;

    }
    System.out.println("STR" + DatatypeConverter.printHexBinary(rainbow.get(0).start));
    System.out.println("STR" + DatatypeConverter.printHexBinary(rainbow.get(1).start));
    System.out.println("variations: " + variations.size());
    System.out.println("all collisions: " + allColl);
    System.out.println();

    return rnbow;
}

package rnbow;

public class Chain {
    byte[] start;
    byte[] end;

    public Chain(byte[] st, byte[] en){
        start = st;
        end = en;
    }


    public byte[] printStart(){
        return start;
     }
}
4

1 に答える 1

1

虹色のテーブル作り なるほど。

しかし、すべての値が最後と同じである場合は、新しい byte[8] をどこでも実行しておらず、単一の配列 (ArrayList で何度も参照している) 内のバイトを置き換えているだけであることを意味します。

于 2013-10-25T07:48:04.303 に答える