阳光下的少年 发表于 2019-1-24 00:32

[Java小白]WIFI纯数字密码字典生成器

本帖最后由 阳光下的少年 于 2019-1-24 00:33 编辑

# WIFI纯数字密码字典生成器
* 设计思路:今天在搞事情的时候看到了Crunch工具界面不仅是英文而且还是字符界面,我就在想我是不是也能用Java语言实现一个呢
* 程序功能:
      * 支持纯数字字典从1到999999999位数
      * 支持显示生成的文件大小(不是占用而是文本长度)
* 还有一个修改生成文件路径的功能,以后再写
## 附上代码
```
package com.str;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Pwd extends JFrame implements ActionListener,FocusListener{
      //初始化列表数组
      String number[] = {"0","1","2","3","4","5","6","7","8","9"};
      
      //创建控件
      JLabel bq1 = new JLabel("最小位数");
      JLabel bq2 = new JLabel("最大位数");
      JLabel bq3 = new JLabel("文件大小");
      JTextField bjk = new JTextField("",6);
      JComboBox lbk1 = new JComboBox(number);
      JComboBox lbk2 = new JComboBox(number);
      JButton an = new JButton("生成字典");
      JTextField wbq = new JTextField("字典生成路径,默认在程序运行目录下");
      
      Pwd(){
                //初始化窗体参数
                super("WIFI纯数字密码字典生成器");
                setVisible(true);
                setSize(400,150);
                setLocationRelativeTo(null);
                setLayout(new FlowLayout());
                setResizable(false);
               
                //初始化布局
                JPanel One = new JPanel(new GridLayout(3,1));
                JPanel Two = new JPanel(new GridLayout(1,4));
                JPanel Three = new JPanel(new GridLayout(1,3));
                JPanel Four = new JPanel(new GridLayout(1,1));
               
                //添加布局到容器
                getContentPane().add(One);
                One.add(Two);
                One.add(Three);
                One.add(Four);
               
                //添加控件到容器
                Two.add(bq1);
                Two.add(lbk1);
                Two.add(bq2);
                Two.add(lbk2);
                Three.add(bq3);
                Three.add(bjk);
                Three.add(an);
                Four.add(wbq);
               
                //控件参数设置
                bjk.setEditable(false);
                wbq.setFont(new Font("黑体",Font.BOLD,20));
                wbq.setEnabled(false);
               
                //绑定监听对象
                an.addActionListener(this);
                wbq.addFocusListener(this);
      }
      //事件源
      public void actionPerformed(ActionEvent e) {
               
                //按钮发生事件
                if(e.getSource().equals(an)) {
                        //返回现行选中项
                        int minNum;
                        int maxNum;
                        
                        //获取字典长度
                        int minNumLength=0;
                        int maxNumLength=0;
                        
                        //获取字典最小长度和最大长度
                        minNum = lbk1.getSelectedIndex();
                        maxNum = lbk2.getSelectedIndex();
                        
                        //初始化字典最小长度
                        switch(minNum) {
                        case 0:
                              JOptionPane.showMessageDialog(this, "最小长度不能为0", "信息", 1);
                              break;
                        }
                        
                        //初始化字典最大长度
                        switch(maxNum) {
                        case 0:
                              JOptionPane.showMessageDialog(this, "长度太小", "信息", 1);
                              break;
                        case 1:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 9;
                              break;
                        case 2:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 99;
                              break;
                        case 3:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 999;
                              break;
                        case 4:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 9999;
                              break;
                        case 5:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 99999;
                              break;
                        case 6:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 999999;
                              break;
                        case 7:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 9999999;
                              break;
                        case 8:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 99999999;
                              break;
                        case 9:
                              if(maxNum<minNum)
                                        JOptionPane.showMessageDialog(this, "最大长度不能小于最小长度", "信息", 1);
                              else
                                        maxNumLength = 999999999;
                              break;
                        }
                        //字典计算
                        /*猜测:可能赋值成功了,但是都被int识别为了一个0,可能需要转换成字符串累加
                         * 这可能会导致上面的操作被视为同一种
                         * int a = 0; 和int a = 00000000;      可能在int看来都是0,这导致了最小数不能以000000开始
                         */
                        while(maxNumLength >= minNumLength) {
//                              System.out.println(maxNumLength +" "+ minNumLength);
                              //minNumLength自增,然后每次循环都写入文件
                              int n = minNumLength+1;
                              String s="";
                              try {
                                        FileWriter fw = new FileWriter("WifiWorlds.txt",true);
                                        BufferedWriter bfw = new BufferedWriter(fw);
                                        //===================================================
                                        //a=00000 == a=0处理方法
                                        minNumLength+=1;
                                        if(maxNum>=minNum) {
                                                //获取当前0的位数
                                                int x = maxNum-minNum;
                                                //解决int对一位以上的0不区别
                                                switch(x) {
                                                case 1:
                                                      s="0";
                                                      break;
                                                case 2:
                                                      s="00";
                                                      break;
                                                case 3:
                                                      s="000";
                                                      break;
                                                case 4:
                                                      s="0000";
                                                      break;
                                                case 5:
                                                      s="00000";
                                                      break;
                                                case 6:
                                                      s="000000";
                                                      break;
                                                case 7:
                                                      s="0000000";
                                                      break;
                                                case 8:
                                                      s="00000000";
                                                      break;
                                                case 9:
                                                      s="000000000";
                                                      break;
                                                }
                                                s=s+String.valueOf(minNumLength);
                                        }
                                        //仔细想想这一段加不加0好像都没什么意义
                                        //a=0-a=010,一样是001...009,010这样递增的,,先这样放着吧
                                        //a=00000 == a=0处理方法
                                        //===================================================
                                        fw.write(s+"\r\n");      //换行且当成字符串处理而不是字符
                                        fw.flush();
                                        fw.close();
                                        bfw.close();
                              }
                              catch(IOException ee) {
                                        JOptionPane.showMessageDialog(this, "文件创建失败", "错误", 0);
                              }
                        }
                        //计算文件大小
                        File f = new File("WifiWorlds.txt");
                        bjk.setText((f.length() / 1024)+"KB");
                        //设置文件路径
                        if(wbq.getText() != "字典生成路径,默认在程序运行目录下") {
                              wbq.setText("功能以后在实现,困得眼睛都睁不开了");
                        }
                }
      }
      //获取焦点
      public void focusGained(FocusEvent e) {
                //清除文本区中的提示文字
                if(e.getSource().equals(wbq)) {
                        if(wbq.getText().equals("字典生成路径,默认在程序运行目录下"))
                              wbq.setText(null);
                }
      }
      //失去焦点
      public void focusLost(FocusEvent e) {
                //如果文本区中的文本为空时显示提示文字
                if(e.getSource().equals(wbq)) {
                        if(wbq.getText().equals(""))
                              wbq.setText("字典生成路径,默认在程序运行目录下");
                }
      }
      //主函数
      public static void main(String[] args) {
                new Pwd();
      }
}
```
### 目前未处理的问题
1. 最小位数无论设置成几位都没效果,它们都会从0开始,这里的0可能在输出之前被int视为了一个0,因为他有可能是000000000-999999999,在int类型看来就是一个0
2. 我后来是把他们分开处理了就是在计算之前先加上当前应该得到的位数0补上,但是位数一旦不是个位时0就会多出来,但不会影响正常使用

---
(https://github.com/TianruiShi/str/blob/master/Windows/Java/WIFI%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%99%A8/src/com/str/Pwd.java)

阳光下的少年 发表于 2019-1-24 10:54

longsui48 发表于 2019-1-24 01:32
Java里0000和0有什么区别 这样写你还不如从最大位数往小了写 还有引入的时候用.*嘛? 这样性能会有 ...

这个000和0的区别我一开始是真么想的,因为是位数密码嘛,假如我选最小位数是3位最大位数是3位那就是说,开始值应该是000然后终止值就是999,,这样好看,但是我发现好像不容易实现,,,那个导入包用的那个*我之前问过别人,他们说我这写的小东西不牵扯这个性能的问题,然后我就直接全部导进来了

longsui48 发表于 2019-1-24 14:44

阳光下的少年 发表于 2019-1-24 10:54
这个000和0的区别我一开始是真么想的,因为是位数密码嘛,假如我选最小位数是3位最大位数是3位那就是说, ...

好看没用啊 客户需求的是你的业务 不是你代码的规范性 满足客户的业务逻辑前提下才有规范性或者性能的挺高才是真的 .*这种性能会有降低的 导原包还行 你试试第三方的包呢?

阳光下的少年 发表于 2019-1-24 00:36

我这是边写边想,有时候也能把自己绕进去,,我怕如果明天再写就得再把代码重新读一遍而且还要在想一遍思路,还不如今晚上一次性写完

longsui48 发表于 2019-1-24 01:32

{:1_901:}Java里0000和0有什么区别 这样写你还不如从最大位数往小了写 还有引入的时候用.*嘛? 这样性能会有损耗的吧?

fq645122 发表于 2019-1-24 07:58

这要跑几年吧

SGC沉默 发表于 2019-1-24 08:22

CPU生成性能不如GPU

污小汪 发表于 2019-1-24 09:05

SGC沉默 发表于 2019-1-24 08:22
CPU生成性能不如GPU

服务器的话没有独立显卡

changjiang 发表于 2019-1-24 09:14

实际上,wifi**有万能钥匙,除此之外,其他的工具也是层出不穷,比如有按生日和名字的密码生成器,你写这玩意不过是重复的造轮子罢了

阳光下的少年 发表于 2019-1-24 10:57

changjiang 发表于 2019-1-24 09:14
实际上,wifi**有万能钥匙,除此之外,其他的工具也是层出不穷,比如有按生日和名字的密码生成器,你写这玩 ...

算是吧,但是我想试试我目前的能力能不能够写这玩意,,我感觉文件操作这里我还是挺头大的

丨灰机丨 发表于 2019-1-24 11:12

随机数吗?
页: [1] 2
查看完整版本: [Java小白]WIFI纯数字密码字典生成器