このコードを実行すると問題が発生します。このメソッドが返す値にアクセスしようとする瞬間まで、すべて正常に動作します。ランダムなバイト ハッシュを生成する必要があります。大きな 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;
}
}