生成数字/ c / wpa2

时间:2013-08-06 16:54:15

标签: c++ numbers

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

00000000000000000001
00000000000000000002
00000000000000000003
00000000000000000011
12300000000099945611 

等等。

我有这段代码,但是:

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

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

3 个答案:

答案 0 :(得分:0)

在这种特殊情况下,为什么不只是一个字符串,并在最低索引处增加字符,如果它溢出(&gt;'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年才能完成序列运行。所以我希望你有足够的时间和健康饮食。

答案 1 :(得分:0)

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

答案 2 :(得分: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删除所有字母字符。