0 / 0 / 0
Регистрация: 12.04.2020
Сообщений: 8
1

Генератор паролей

12.04.2020, 22:49. Показов 1009. Ответов 9
Метки нет (Все метки)

Только начал изучать C++. Примерно понимаю, что происходит в этой программе, но там нет самой функции генератора паролей. Помогите, пожалуйста дописать. И будет ли это работать в windows или здесь используются библиотеки, которые предназначены для линукса? Извините заранее, если допустил какие ошибки или неточности в формулировках)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <cstdlib> // для функций strtol, exit
#include <unistd.h> // для функции getopt
using namespace std;
// реализация интерфейса в виде класса
class Opts
{
private:
// константы с пределами значений
    static constexpr int minLen = 8;
    static constexpr int maxLen = 40;
    static constexpr int minNum = 1;
    static constexpr int maxNum = 20;
// атрибуты
    int passLen = minLen; // длина пароля
    int passNum = minNum; // количество паролей
    bool useNums = false; // использовавание цифр
    bool useAlpha = false; // использование букв
    bool useSign = false; // использование знаков
    void usage(const char* progName); //вывод подсказки и останов
public:
    Opts(int argc, char **argv); // конструктор
// "геттеры" с результатами разбора параметров
    int getLen()
    {
        return passLen;   //длина пароля
    }
    int getNum()
    {
        return passNum;   //кол-во паролей
    }
    bool isNums()
    {
        return useNums;   // исп. цифр
    }
    bool isAlpha()
    {
        return useAlpha;   // исп. букв
    }
    bool isSign()
    {
        return useSign;   // исп. знаков
    }
};
int main(int argc, char **argv)
{
    Opts op(argc, argv); // реализуем разбор ПКС
// получаем результат разбора ПКС
    cout<<op.getLen()<<endl;
    cout<<op.getNum()<<endl;
    cout<<boolalpha;
    cout<<op.isNums()<<endl;
    cout<<op.isAlpha()<<endl;
    cout<<op.isSign()<<endl;
// TODO здесь будет сам генератор паролей
    return 0;
}
// реализация конструктора - весь разбор ПКС здесь
Opts::Opts(int argc, char **argv)
{
    int opt;
    while ((opt = getopt(argc, argv, "l:n:0ash")) != -1) {
        switch (opt) {
        case 'l': // длина пароля
            passLen = strtol(optarg,nullptr,10);
            if (passLen < minLen || passLen > maxLen) {
// если ошибка - сообщить и завершить
                cerr<<"passLen must be from 8 to 40\n";
                usage(argv[0]);
            }
            break;
        case 'n': // кол-во паролей
            passNum = strtol(optarg,nullptr,10);
            if (passNum < minNum || passNum > maxNum) {
// если ошибка - сообщить и завершить
                cerr<<"passNum must be from 1 to 20\n";
                usage(argv[0]);
            }
            break;
        case '0': // исп. цифры
            useNums = true;
            break;
        case 'a': // исп. буквы
            useAlpha = true;
            break;
        case 's': // исп. знаки
            useSign = true;
            break;
        case 'h': // -h help
        case '?': // неверный параметр
        case ':': // нет значения у параметра
            usage(argv[0]); // сообщить и завершить
        }
    }
// если не установлено ничего из алфавита - установить все
    if (!useNums && !useAlpha && !useSign) {
        useAlpha = useNums = useSign = true;
    }
}
// краткая справки и досрочное завершение программы
void Opts::usage(const char* progName)
{
    cout<<"Usage: "<<progName<<" [-l pass_len] [-n pass_num] [-0] [-a] [-s]\n";
    exit(1);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2020, 22:49
Ответы с готовыми решениями:

Создать генератор паролей в котором можно указать длину пароля и количество паролей
Помогите пожалуйста! Задание: Нужно создать генератор паролей в котором можно указать длину пароля...

Генератор паролей
Привет юзерам cyberforum'а. Требуется следующее: Написать программу - генератор паролей....

Генератор паролей
нужно сгенерировать пароль хотя что бы большие латинские буквы, Коды английских символов -...

Генератор паролей
Здравствуйте! Мне нужна ваша помощь! Мне нужно, чтобы пароли которые я генерирую, записывались в...

9
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
12.04.2020, 23:10 2
В Windows не будет работать без переделки.
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.04.2020, 00:47 3
Цитата Сообщение от Cyberlife Посмотреть сообщение
будет ли это работать в windows или здесь используются библиотеки, которые предназначены для линукса?
Используются, <unistd.h>. Но как пишут в интернете, `Unix compatibility layers such as Cygwin and MinGW also provide their own versions of unistd.h`. Значит будет и в Windows работать, если компилятор Cygwin или MinGW.

Добавлено через 3 минуты
В генераторе паролей есть разбор параметров, но нет самого генератора. Забавно. Откуда эта поделка, если не секрет?
1
0 / 0 / 0
Регистрация: 12.04.2020
Сообщений: 8
13.04.2020, 13:29  [ТС] 4
Из учебника
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.04.2020, 13:46 5
Цитата Сообщение от Cyberlife Посмотреть сообщение
Из учебника
Там есть какие-то рекомендации по "дописыванию" генератора, или любой вариант допустим?
1
0 / 0 / 0
Регистрация: 12.04.2020
Сообщений: 8
13.04.2020, 15:38  [ТС] 6
Рекомендаций никаких нет
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.04.2020, 16:22 7
Лучший ответ Сообщение было отмечено Cyberlife как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <iostream>
 
// === Добавлено ==================================================================================
#include <cassert>
#include <random>
#include <string>
#include <vector>
// ================================================================================================
 
#include <cstdlib> // для функций strtol, exit
#include <unistd.h> // для функции getopt
using namespace std;
// реализация интерфейса в виде класса
class Opts
{
private:
// константы с пределами значений
    static constexpr int minLen = 8;
    static constexpr int maxLen = 40;
    static constexpr int minNum = 1;
    static constexpr int maxNum = 20;
// атрибуты
    int passLen = minLen; // длина пароля
    int passNum = minNum; // количество паролей
    bool useNums = false; // использовавание цифр
    bool useAlpha = false; // использование букв
    bool useSign = false; // использование знаков
    void usage(const char* progName); //вывод подсказки и останов
public:
    Opts(int argc, char **argv); // конструктор
// "геттеры" с результатами разбора параметров
    int getLen() const
    {
        return passLen;   //длина пароля
    }
    int getNum() const
    {
        return passNum;   //кол-во паролей
    }
    bool isNums() const
    {
        return useNums;   // исп. цифр
    }
    bool isAlpha() const
    {
        return useAlpha;   // исп. букв
    }
    bool isSign() const
    {
        return useSign;   // исп. знаков
    }
};
 
// === Добавлено ==================================================================================
static const std::string set_alpha = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
static const std::string set_digit = "0123456789";
static const std::string set_special = ".,<>?!/|\\@#$%^&*()[]";
 
std::string passgen(int len, const std::string &letters) {
    assert(letters.length() != 0);
 
    std::random_device rd;
    std::mt19937_64 gen(rd());
    std::uniform_int_distribution<unsigned long> dist(0, letters.length() - 1);
 
    std::string passwd;
    for (int i = 0; i < len; ++i) {
        passwd += letters[dist(gen)];
    }
 
    return passwd;
}
 
std::vector<std::string> passgen(const Opts &opts) {
    std::string letters;
 
    if (opts.isAlpha()) letters += set_alpha;
    if (opts.isNums()) letters += set_digit;
    if (opts.isSign()) letters += set_special;
 
    std::vector<std::string> pass_list;
    for (int i = 0; i < opts.getNum(); ++i) {
        pass_list.push_back(passgen(opts.getLen(), letters));
    }
 
    return pass_list;
}
// ================================================================================================
 
int main(int argc, char **argv)
{
    Opts op(argc, argv); // реализуем разбор ПКС
// получаем результат разбора ПКС
    cout<<op.getLen()<<endl;
    cout<<op.getNum()<<endl;
    cout<<boolalpha;
    cout<<op.isNums()<<endl;
    cout<<op.isAlpha()<<endl;
    cout<<op.isSign()<<endl;
 
    // TODO здесь будет сам генератор паролей
// === Добавлено ==================================================================================
    for (const std::string &pass : passgen(op)) {
        std::cout << pass << endl;
    }
// ================================================================================================
 
    return 0;
}
// реализация конструктора - весь разбор ПКС здесь
Opts::Opts(int argc, char **argv)
{
    int opt;
    while ((opt = getopt(argc, argv, "l:n:0ash")) != -1) {
        switch (opt) {
        case 'l': // длина пароля
            passLen = strtol(optarg,nullptr,10);
            if (passLen < minLen || passLen > maxLen) {
// если ошибка - сообщить и завершить
                cerr<<"passLen must be from 8 to 40\n";
                usage(argv[0]);
            }
            break;
        case 'n': // кол-во паролей
            passNum = strtol(optarg,nullptr,10);
            if (passNum < minNum || passNum > maxNum) {
// если ошибка - сообщить и завершить
                cerr<<"passNum must be from 1 to 20\n";
                usage(argv[0]);
            }
            break;
        case '0': // исп. цифры
            useNums = true;
            break;
        case 'a': // исп. буквы
            useAlpha = true;
            break;
        case 's': // исп. знаки
            useSign = true;
            break;
        case 'h': // -h help
        case '?': // неверный параметр
        case ':': // нет значения у параметра
            usage(argv[0]); // сообщить и завершить
        }
    }
// если не установлено ничего из алфавита - установить все
    if (!useNums && !useAlpha && !useSign) {
        useAlpha = useNums = useSign = true;
    }
}
// краткая справки и досрочное завершение программы
void Opts::usage(const char* progName)
{
    cout<<"Usage: "<<progName<<" [-l pass_len] [-n pass_num] [-0] [-a] [-s]\n";
    exit(1);
}
1
0 / 0 / 0
Регистрация: 12.04.2020
Сообщений: 8
13.04.2020, 17:19  [ТС] 8
Спасибо Вам огромное! Теперь всё прекрасно работает
0
nmcf
13.04.2020, 17:27
  #9

Не по теме:

Cyberlife, что толку с такого "изучения", если ты сам ничего не сделал?

0
0 / 0 / 0
Регистрация: 12.04.2020
Сообщений: 8
13.04.2020, 17:47  [ТС] 10
nmcf, к сожалению, соглашусь с Вами, но тем не менее valen10 помог довести программу до ума, чтобы лучше ее понять. Может я и не прав, спорить не буду. Спасибо всем, кто принял в этом участие
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2020, 17:47
Помогаю со студенческими работами здесь

Генератор паролей на C++
Пока регистрировался на сайте задумался о генераторе паролей и решил написать свой. Хочу им...

генератор паролей
кто нибудь может показать программку генератор паролей?

Генератор паролей
Представляю Вам генератор паролей на C++. Спасибо пользователю nammidd за помощь в изменении...

Генератор паролей
Кто может чётко написать коментарии для генератора паролей Просто я учусь программировать на С++ и...

Генератор паролей
1. В таблице 1 найти требования, которым должен удовлетворять генератор паролей, соответствующий...

Дописать генератор паролей
Привет Всем !!! Мне нужно для этого генератора: 1) добавить ограничение ввода букв в (длину...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru