繁体   English   中英

生成数字/ c / wpa2

[英]Generate numbers /c /wpa2

我想生成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”,因此Linux shell中的g ++编译器也不想执行。

在这种特殊情况下,为什么不只拥有一个字符串,并且在最低索引处增加字符(如果它溢出(>'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年的时间。 因此,我希望您有足够的时间并且饮食健康。

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

从字面上看,要遍历所有这些数字将花费数年。

如果您只想生成一个随机的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删除所有字母chars

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM