1

我正在尝试使用 Rainbow Tables 编写一个程序来散列和破解长度为 4 的密码。哈希值的算法是:ℎℎ = (163 ∗ ℎ 0) + (162 ∗ ℎ 1 + (161 ∗ ℎ 2) + (160 ∗ ℎ 3)。

我需要帮助弄清楚我在计算方法上做错了什么。代码前有注释说明如果这有助于解决问题需要做什么。

public void compute() {
    //TODO:  Add code to compute all possible 4-letter passwords - store in rainbow
    // Begin your possible passwords with aaaa and end with zzzz
    // Use hashCode(pwd) % 29 to determine the key (index) of where this element should be added to rainbow's ArrayList of ArrayLists
    // You will need to cast as int, such as key = (int) hashCode(pwd)%29  - key is the index of where to add this element in the rainbow ArrayList of ArrayLists
    if(password.length() != passwordLength){
        throw new InvalidPasswordException();
    }
    while(password.startsWith("aaaa") && password.endsWith("zzzz")){
        key = (int) (hashCode(password)%29);
        rainbow.add(key, password);
    }
}

如果需要更多信息,请告诉我。

编辑:这是整个代码,因此可以看到所有其他方法(尚未全部完成)

import java.util.*;
public class HashMap implements HashMapADT{
private String password;
private Long hash;
private int key;
private final int passwordLength = 4;
ArrayList<ArrayList<PasswordMap>> rainbow;

public HashMap() {
    password = "";
    hash = -1L;
    key = -1;
    initializeHashMap();
}
public HashMap(String str) {
    password = str;
    hash = hashCode(str);
    key = (int)(hash % 29);
    initializeHashMap();
}

private void initializeHashMap() {
    //Initialize an ArrayList of 29 elements - when dividing by 29 only remainders 0 - 28 are possible
    rainbow = new ArrayList<>();
    for(int i = 0; i < 29; i++) {
        rainbow.add(new ArrayList<PasswordMap>());
    }
    compute();      
}

public Long hashCode(String str) throws InvalidPasswordException{
    this.hash = 0L;

    //TODO:  Calculate hashCode using hashing function based on powers of 29

    return 0L;  // temp - delete once hashCode method is implemented.
}

public void compute() {
    //TODO:  Add code to compute all possible 4-letter passwords - store in rainbow
    // Begin your possible passwords with aaaa and end with zzzz
    // Use hashCode(pwd) % 29 to determine the key (index) of where this element should be added to rainbow's ArrayList of ArrayLists
    // You will need to cast as int, such as key = (int) hashCode(pwd)%29  - key is the index of where to add this element in the rainbow ArrayList of ArrayLists
    if(password.length() != passwordLength){
        throw new InvalidPasswordException();
    }
    while(password.startsWith("aaaa") && password.endsWith("zzzz")){
        key = (int) (hashCode(password)%29);
        rainbow.add(key, password);
    }
}
public Long hash(String pwd) {
    //TODO:  Return the hashcode for a given password
    // First, hash the password: int key = (int)(hashCode(pwd) % 29);
    // Use this key to determine which element in the rainbow table you should be traversing to find the hash code
    // Recall rainbow is an ArrayList of ArrayLists!!
    key = (int)(hashCode(pwd)%29);

    return 0L;  // temp - delete once hash method is implemented.
}

public String hack(Long pwdHash) {
    String pwd="";
    //TODO:  Given a hashed password, pwdHash, determine the password
    // When identifying a correct hashed password, you will need to look at a difference RATHER THAN ==
    // That is, 
    //if (Math.abs(pwdHash - rainbow.get(key).get(i).getHash())<.001)  -  you've found your password!!
    // Note:  key is the location of the rainbow list you should be traversing:  key = (int)((pwdHash) % 29);


    return pwd;
}

@Override
public String toString() {
    return password + ": " + hash;
}

}

4

1 回答 1

1

这里的问题是你的while循环。

while(f())表示“只要f()返回 true,就继续这样做”。

您说过“只要password以“aaaa”开头并password以“zzzz”结尾,就继续这样做。

我们没有看到你初始化password,但如果它是描述的四字符字符串,它不可能同时以“aaaa”开头并以“zzzz”结尾,因此 while 循环的块将永远不会执行。

如果password"aaaazzzz"这样,则条件为真,那么,由于您从不修改 的值password,因此 while 循环将永远重复。

你可能想要这样的东西:

for(int i=0;; i++) {
    String password = createPassword(i);
    rainbow.add(password, hash(password));
}

...并编写一个返回“aaaa”、返回“aaab”、返回“aaba”createPassword()等​​的方法。createPassword(0)createPassword(1)createPassword(26)

于 2017-11-06T17:29:17.833 回答