0

我想生成 20 个字符的 wpa2 密钥,它只包含 C++ 中 1-10,000,000,000,000,000,000 之间的数字。每个键的输出格式必须是 20 个字符的格式,例如:

00000000000000000001
00000000000000000002
00000000000000000003
00000000000000000011
12300000000099945611 

等等。

我有这个代码,但是:

  1. 它不会使生成的数字以 20 个字符的格式降序排列。

    for (int i=0;i<=10000000000000000000;i++){
        cout << 10000000000000000000 -i<<"\n";
    }
    
  2. 由于“10000000000000000000 -i”的大小,这些数字 r 大于(长)整数,因此 linux shell 中的 g++ 编译器也不想执行。

4

3 回答 3

0

从字面上看,遍历所有这些数字将需要数年时间。

如果您只是想生成一个随机的 20 字符 WPA2 密钥,您应该使用内置函数执行以下操作:

#include <iostream>
#include <string>
#include <chrono>
#include <random>
#include <algorithm>

std::string get_key() {
    // Define all allowed characters (a WPA2 key can also contain letters).
    std::string chars =
    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    // Shuffle the characters.
    std::mt19937 g(std::chrono::system_clock::now().time_since_epoch().count());
    std::shuffle(std::begin(chars), std::end(chars), g);

    // Return the first 20 characters.
    return chars.substr(0, 20);
}

int main() {
    std::cout << get_key() << std::endl;
}

如果您只想要一个由数字组成的键,则从 . 中删除所有字母字符chars

于 2013-08-06T17:40:22.223 回答
0

如果要将其存储为数字,则编译器需要支持 64 位整数。它可能被支持为 long long 数据类型。将 i 更改为 unsigned long long,并将数字文字更改为 10000000000000000000ULL。请注意不要将这些值转换为 int(意外或其他),否则您将丢失一些数据。

于 2013-08-06T17:18:38.487 回答
0

在这种特殊情况下,为什么不只是有一个字符串,并在最低索引处增加字符,如果它溢出(> '9'),然后增加下一个字符。重复并冲洗直至完成。

所以,像这样:

 std::string s = '000';

 std::string::size_type len = s.length()
 while (s != "999")
 {
    cout << s << endl;
    s[len-1] ++;
    int i = len-1; 
    while(s[i] > '9' && i >= 0)
    {
       s[i] = '0';
       i--;
       s[i]++;
    }
 }

但是,如果您有一台机器每秒执行上述代码的一个循环 1,000,000,000 次,则运行您的序列将需要 317 年。所以我希望你有足够的时间并且吃得健康。

于 2013-08-06T17:05:26.450 回答