我想生成20个字符的wpa2密钥,它只包含1到10,000,000,000,000,000,000个C ++中的数字。每个密钥的输出格式必须是20个字符的格式,如:
00000000000000000001
00000000000000000002
00000000000000000003
00000000000000000011
12300000000099945611
等等。
我有这段代码,但是:
它不会使生成的数字以20字符格式降序。
for (int i=0;i<=10000000000000000000;i++){
cout << 10000000000000000000 -i<<"\n";
}
这些数字r大于(长)整数,因此linux shell中的g ++编译器也不想执行,因为大小为“10000000000000000000 -i”。
答案 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
删除所有字母字符。