-4

我想用 Java 构建一个非常基本的密码生成器。我在字符串中设置了我需要的所有字符。我想生成字符串中所有可能的字符排列,密码长度为 1-256 个字符。

编辑,人们想要一些代码:

String ascii = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&'()*+.-/:;<=>?@[]^_{|}~";
    for (int i = 0; i < 255; i++) {
        for (int j = 0; j < ascii.length(); j++) {
            for (int k= 0; k < ascii.length(); k++) {
                System.out.print(ascii.charAt(k));
            }
        }
        System.out.println("");
    }

这是我到目前为止所拥有的,我知道它不起作用。System.out.println底部是为它生成的每个密码创建一个新行。

编辑 2,我觉得这被误读为希望生成随机密码。我正在尝试生成我可以人工生成的每个密码的列表。

4

2 回答 2

0

这是一个递归问题。所以让我们利用递归和麻袋的力量来发挥我们的优势。如果我们查看一个ascii 表,我们可以看到 pw 中的字符来自!到〜这是32-126。知道了这一点,我们可以只为每个字符添加一个,直到我们到达最后一个,然后继续前进,直到达到所需的长度。您可以根据自己的喜好限制“允许的字符”和长度。但是可能性的数量增长非常快,因此随着可能性数量的增加,您很可能会很快耗尽堆栈空间。

public static final int LENGTH=2; // the length of passwords we want to generate

public static void passWordGen(String currentPass,char c){      
    if(c<='~'){
        System.out.println(currentPass+c);
        passWordGen(currentPass,(char)(c+1)); //go through every character at this postion
        if(currentPass.length()<LENGTH-1){
            passWordGen(currentPass+c,'!'); //start over by adding the current charterer to the current postion
        }
    }       
}
public static void main(String[] args) {        
        passWordGen("",'!'); // kick off the recursion with an empty string and the first character         
}
于 2013-05-31T04:09:19.610 回答
0

我猜这应该对你有用。如果您需要任何修改,请告诉我。享受吧,这将产生您所拥有的所有排列。不确定您是否要破解一些密码,哈哈,我已经添加了排列和组合方法。请根据您的需要使用。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stackoverflow;

import java.util.Random;

/**
 *
 * @author Ashish Tyagi
 */
public class Stackoverflow {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        //String ascii = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&'()*+.-/:;<=>?@[]^_{|}~";
        String ascii="abc";
        for(int i=1;i<=ascii.length();i++){
        combin(ascii.substring(0, i), new StringBuffer(), i);
        combin(ascii.substring(i), new StringBuffer(), i);
    }
  }


 public static void combin(String input,StringBuffer output,int depth){
      if (depth == 0) {
            System.out.println(output);
        } else {
            for (int i = 0; i < input.length(); i++) {
                output.append(input.charAt(i));
                combin(input, output,depth - 1);
                output.deleteCharAt(output.length() - 1);
            }
        }    
 }
}
于 2013-05-31T03:06:12.073 回答