powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничный pwdgen
25 сообщений из 188, страница 4 из 8
Тяпничный pwdgen
    #38809706
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Время, требуемое на выполнение можно рассчитать, и вывести общую формулу.Мне кажется что потребуется минимум несколько лет, или столетий в крайних случаях. С кодом тоже завтра буду разбираться..засыпаю.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809712
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли адрес не принадлежит тем адресам, по которым выделена память, то мы получаем undefined behaviour, потому, если мы получаем истинный результат, не факт что он действительно истинный. Хотя если получаем ложный, то наверняка знаем что он ложный. Интересное свойствоUB будет, если _читать_ данные из указателя, который не принадлежит к выделенному куску памяти. Для сравнения чтение не требуется. И, конечно, если мы получили истинный результат, то это факт, что он действительно истинный, из этого адреса можно читать без всяких там UB. Иначе программирование в принципе не возможно.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809729
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли задача сводится к тому что надо гонять генератор по кругу и иногда получать от него текущее состояние, то можно так
Код: plaintext
1.
2.
3.
4.
int64 i = START_VALUE;
while(true) {
  i++;
}



Далее при выводе считаем что i это N-ричное число, где N это количество символов в алфавите отображения, далее переводим значение в нужную систему счисления и выводим. Например: при алфавите a-z это 26-ричная система счисления, тогда значение 1234 будет "avm"

Я подумаю над этим. Но мне нужно реализовать развитую систему правил.
Например. Чайник неосилил свой pwd от .zip архива и пришёл ко мне.
Говорит. "- Я помню что pwd начинался с моего имени TheChainik
в разных регистрах (theChainik,THECHAINIK) и содержал дату вида 19##
и еще 2 символа верхнего ряда клавиатуры. Пунктуация. С шифтом короче.

Я ему грю - не сцы. Ща. Делаю магические страшные колдунства.

Код: plaintext
1.
$ pwdgen --pattern={TheChainik}(AnyCase)19##[:punct:]{2} | zipDecode ChainikFuckenZipPronArchive.zip



И вуаля. Средиземноморье спасено от зла! Profit. Может не сразу. Может через день. Или через недельку.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809732
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак вариант: можно снимать текущее значение другим потоком. Можно несколько потоков запустить, а результат склеивать.

По поводу промежуточного хранения: может не заморачиваться и брать для старта какой-нибудь хэш от текущей даты/времени?

PS Только паузу надо добавить чтоб проц не спалить такой считалкой
Вот здесь я не совсем понял какая связь между хешем от текущей даты/времени и моей задачей.

P.S. Проц достойно охлаждается и даже стоит на балконе.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809744
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВремя, требуемое на выполнение можно рассчитать, и вывести общую формулу.Мне кажется что потребуется минимум несколько лет, или столетий в крайних случаях. С кодом тоже завтра буду разбираться..засыпаю.
pwd из 20 символов - это маргинальный пример которого я надеюсь никогда
не будет.

P.S. Что у тебя за часовой пояс?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809763
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonP.S. Что у тебя за часовой пояс?в Москве 15:00, во Владивостоке - полночь )) оч. похоже на правду, кмк )))
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809774
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эк вас разнесло по земному шарику... Ну ладно. Пойду фиксить баги. Работа зовёт. До вечера по GMT+2.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809831
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TИМХУ Рекурсия тут хорошо подходит, но накладных расходов у нее много, не производительно это.
Два дня думаю над сохранением состояния. В случае если юзер нажал Ctrl+C или тикнул таймер (раз
в минуту) приложение должно писать состояние своей FSM в какой-нить файл типа
/var/run/pwdgen.fsm.

При следующем старте с указанием опции --continue процесс должен возобновиться не с нуля
а с этого состояния. Причём небольшой "нахлёст" допускается. Для pwdgen это не страшно.
Главное - поскипать миллиарды уже отработанных состояний и не потерять работу двух-трех
суток.

Для варианта с рукотворным Stack или Queue я знаю как это сделать. Правда придётся полностью
переколбасить алгоритм и рекуррентную процедуру pa(processAlphabet) развернуть в FSM.
Мне это не улыбается. Мне нравится рекурсия и скорость работы пока устраивает. Другое
дело что инстанциировать "рекурсию в определённом" состоянии я пока не знаю как.

Вобщем это пока предмет основных моих размышлений.
Смотри мой вариант выше. Для повышения быстродействия переписал вывод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void print_num()
{
    char str[256];

    size_t i = 0;
    while(num[i])
        str[i]=sym_set[ num[i++] - 1 ];

    str[i]=0;
    puts(str);
}

Быстродействие сопостовимое, легко сохранять состояние, легко расспараллелить.

Dima TЕсли задача сводится к тому что надо гонять генератор по кругу и иногда получать от него текущее состояние, то можно так
Код: plaintext
1.
2.
3.
4.
int64 i = START_VALUE;
while(true) {
  i++;
}



Далее при выводе считаем что i это N-ричное число, где N это количество символов в алфавите отображения, далее переводим значение в нужную систему счисления и выводим. Например: при алфавите a-z это 26-ричная система счисления, тогда значение 1234 будет "avm"
...у меня так и сделано
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809853
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla, понимаешь... как-то оно... слишком негибко получается. Крутить 64х битное число
для решения перебора в дереве...

А собсно почему в дереве? А потому. Здесь больше тако подход. В исходных данных мы описываем
некий паттерн вроде регекспа. Он описывает порождающий генератор.

Например паттерн:

Код: plaintext
1.
{Passw|Password|Pwd}\d{1,5}


Описывает:

Код: plaintext
1.
2.
3.
4.
5.
Passw12345
.....
Pwd99
...
Password99999


Я легко себе представляю его в виде рекурсии. Разложение-же такого дерева в множители 64-х битного
числа во первых само по себе задача нетривиальная. Во вторых при некотором количестве делений
их сложность уже будет сопоставима с накладными на рекурсию. Тоесть я прогнозирую провал
в производительности на шаблоне чуть более сложном чем буквы латиницы.

А в плане сохранения состояния - да. Очень удобно. Не спорю.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809861
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, в этом случае имеем 8 "букв": 1,2,3,4,5,Pwd,Password,Passw. Итого перебираем восьмеричные числа.
Для:
0 выведем '1'
7 выведем 'Passw'
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809872
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет бро. Ты будешь флудить запрещёнными комбинациями.

Код: plaintext
1.
PasswPasswPasswPasswPasswPasswPasswPassw



?

У тебя это допускается.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809899
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, тогда необходимо "хитрое" число, каждый разряд которого будет в своей системе счисления со своим "алфавитом".
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809911
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaу меня так и сделано
Не совсем. Я вот про что:
Код: plaintext
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.
// вывод в N-ричной системе счисления
// n - то что выводить, alf - алфавит, len - размер алфавита
void printf_n(int n, char* alf, int len) 
{
	char buf[256];
	char *p = buf + 255;
	*p = 0;
	while(n) {
		p--;
		*p = alf[n % len];
		n /= len;
	}
	printf("%s\n", p);
	
}

int main(int argc, char* argv[])
{
	char alf[] = "abcdefghijklmnopqrstuvwxyz";
	int len = strlen(alf);
	for(int i = len; i < len * len * len; i++) {
		printf_n(i, alf, len);
	}
	system("pause");
    return 0;
}


Это решение исходной задачи. Правда с небольшим исключением, нет "aa" и "aaa" т.к. это ноль и пишется он как "a".
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809924
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slamayton, тогда необходимо "хитрое" число, каждый разряд которого будет в своей системе счисления со своим "алфавитом".как-то так:

Код: plaintext
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.
#include <iostream>
#include <cstring>

using namespace std;


char tricky_number[256];
char scale_of_notation[256];

//////////////////////////////////////////
void add_num()
{
    size_t i = 0;
    bool carry = false;

    do{
        tricky_number[i]++;
        if(tricky_number[i] > scale_of_notation[i])
        {
            tricky_number[i] = 1;
            carry = true;
        }
        else
        {
            carry = false;
        }

        i++;
    }while(carry);

}
//////////////////////////////////////////
void print_num()
{
    size_t i = 0;
    while(tricky_number[i])
        cout << tricky_number[i++] - 1;

    cout<<endl;
}
//////////////////////////////////////////
int main()
{
    memset(tricky_number, 0, sizeof(tricky_number));
    memset(scale_of_notation, 10, sizeof(scale_of_notation)); //по умолчанию каждый разряд в 10 системе счисления

    tricky_number[0]=1;

    scale_of_notation[0]=2; // 0 разряд в 2-й системе счисления
    scale_of_notation[1]=3; // 1 разряд в 3-й системе счисления
    scale_of_notation[2]=7; // 2 разряд в 7-й системе счисления

    for(int i=0;i<250;i++)
    {
            cout << "dec=\t" << i << "\ttricky number=\t";
            print_num(); // выводим "хитрое" число
            add_num(); //увеличиваем "хитрое" число
    }

    return 0;
}

...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809927
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот здесь я не совсем понял какая связь между хешем от текущей даты/времени и моей задачей.
Я пофантазировал и предположил что возможно начинать крутить счетчик со случайного места, для паролей допустимо. Хэш от даты-времени иногда использую для генерации больших случайных чисел, вместо rand().

Но если последовательность надо соблюдать - тогда надо хранить.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809932
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slamayton, тогда необходимо "хитрое" число, каждый разряд которого будет в своей системе счисления со своим "алфавитом".
Думаю да. Но я не знаю как придумать такое "хитрое" число. Пока не знаю.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809936
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tm_Slaу меня так и сделано
Не совсем. Я вот про что:
Код: plaintext
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.
// вывод в N-ричной системе счисления
// n - то что выводить, alf - алфавит, len - размер алфавита
void printf_n(int n, char* alf, int len) 
{
	char buf[256];
	char *p = buf + 255;
	*p = 0;
	while(n) {
		p--;
		*p = alf[n % len];
		n /= len;
	}
	printf("%s\n", p);
	
}

int main(int argc, char* argv[])
{
	char alf[] = "abcdefghijklmnopqrstuvwxyz";
	int len = strlen(alf);
	for(int i = len; i < len * len * len; i++) {
		printf_n(i, alf, len);
	}
	system("pause");
    return 0;
}


Это решение исходной задачи. Правда с небольшим исключением, нет "aa" и "aaa" т.к. это ноль и пишется он как "a".у меня так и сделано
только число num у меня сразу хранится в N-ной системе счисления, т.к. операция перевода дорогая
в цикле увеличиваю число num, потом вывожу
цикл немного другой, но смысл именно такой
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809940
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonВот здесь я не совсем понял какая связь между хешем от текущей даты/времени и моей задачей.
Я пофантазировал и предположил что возможно начинать крутить счетчик со случайного места, для паролей допустимо. Хэш от даты-времени иногда использую для генерации больших случайных чисел, вместо rand().

Но если последовательность надо соблюдать - тогда надо хранить.
Ну... если честно то я искал также псевдослучайный алгоритм выбрасывания паролей
из порождающего генератора.

Трудность была в том чтобы 100% элементов были извлечены из генератора и чтобы
не было повторов.

Сами понимаете что класть это всё в массив или в базу данных нельзя. Нет у нас таких
ресурсов да и не танцует такая постановка. Всё таки "утилиту" делаю а не облачный
сторедж.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809950
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем.... для инстанциирования думаю надо 0 заменить на некую уже обсчитанную величину.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int pa(char *a,int asize,int m,int M){
	if (m<M){
		int i;
		for(i=0;i<asize;i++){
			buf[m]=a[i];
			pa(a,asize,m + 1, M);
		}
	} else {
		buf[M]='\0';
		puts(buf);
        }
}



По сути функция pa(..) должна видеть некий глобальный вектор инициализации. Как-то так.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809972
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
#include <iostream>
#include <cstring>

using namespace std;


char *a[]={"One","Two"};
char *b[]={"%","$","&"};
char *c[]={"1","2","3","4","5","6","7"};

char **alphabet[256];
char tricky_number[256];
char scale_of_notation[256];

//////////////////////////////////////////
void add_num()
{
    size_t i = 0;
    bool carry = false;

    do{
        tricky_number[i]++;
        if(tricky_number[i] > scale_of_notation[i])
        {
            tricky_number[i] = 1;
            carry = true;
        }
        else
        {
            carry = false;
        }

        i++;
    }while(carry);

}
//////////////////////////////////////////
void print_num()
{
    size_t i = 0;
    while(tricky_number[i])
        cout << alphabet[i][tricky_number[i++] - 1];

    cout<<endl;
}
//////////////////////////////////////////
int main()
{
    memset(tricky_number, 0, sizeof(tricky_number));
    memset(scale_of_notation, 10, sizeof(scale_of_notation)); //по умолчанию каждый разряд в 10 системе счисления

    tricky_number[0]=1; // инициализация "хитрого" числа

    scale_of_notation[0]=2; // 0 разряд в 2-й системе счисления
    scale_of_notation[1]=3; // 1 разряд в 3-й системе счисления
    scale_of_notation[2]=7; // 2 разряд в 7-й системе счисления

    alphabet[0]=a; // алфавит для 0 разряда
    alphabet[1]=b; // алфавит для 1 разряда
    alphabet[2]=c; // алфавит для 2 разряда

    for(int i=0;i<50;i++)
    {
            cout << "dec=\t" << i << "\ttricky number=\t";
            print_num(); // выводим "хитрое" число
            add_num(); //увеличиваем "хитрое" число
    }

    return 0;
}
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809992
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНапример. Чайник неосилил свой pwd от .zip архива и пришёл ко мне.
Говорит. "- Я помню что pwd начинался с моего имени TheChainik
в разных регистрах (theChainik,THECHAINIK) и содержал дату вида 19##
и еще 2 символа верхнего ряда клавиатуры. Пунктуация. С шифтом короче.

Я ему грю - не сцы. Ща. Делаю магические страшные колдунства.

Код: plaintext
1.
$ pwdgen --pattern={TheChainik}(AnyCase)19##[:punct:]{2} | zipDecode ChainikFuckenZipPronArchive.zip


Мести чайников юзеров не боишься? Пока давишь кнопки типа "ThEcHaInIkd45g%r18112014" много непечатных слов произнесешь в адрес изобретателя этого чудо-пароля.

Может проще в архив зашить кодовое слово, по которому ты найдешь пароль с первого раза? Т.е. генеришь пару паролей, один пишешь в архив, в камменты, вторым шифруешь. Пару пишешь в лог. Потеряли - спрашиваешь первый и по нему ищешь. Тогда длинный пароль не надо.

И насчет длины: при использовании алфавита из 70 символов и пароля в 7 символов = 8 триллионов комбинаций, устанешь подбирать. Подумай, надо ли над юзерами издеваться?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809996
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla, ОК. Пожалуй сделаю бранч утилиты. Будет два направления. Рекурсивное и Tricky-численное.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810004
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожет проще в архив зашить кодовое слово, по которому ты найдешь пароль с первого раза? Т.е. генеришь пару паролей, один пишешь в архив, в камменты, вторым шифруешь. Пару пишешь в лог. Потеряли - спрашиваешь первый и по нему ищешь. Тогда длинный пароль не надо.

И насчет длины: при использовании алфавита из 70 символов и пароля в 7 символов = 8 триллионов комбинаций, устанешь подбирать. Подумай, надо ли над юзерами издеваться?
Да нету у меня такой власти. И не админ я вовсе. Да и никто не соблюдает такие условности.

Как говорил Дзюбей Кибогами - куда-бы ты ни пошёл - всюду земля как земля. Небо - как небо. Люди - как люди.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810013
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу... если честно то я искал также псевдослучайный алгоритм выбрасывания паролей
из порождающего генератора.

Трудность была в том чтобы 100% элементов были извлечены из генератора и чтобы
не было повторов.

Сами понимаете что класть это всё в массив или в базу данных нельзя. Нет у нас таких
ресурсов да и не танцует такая постановка. Всё таки "утилиту" делаю а не облачный
сторедж.
Вопрос возникает: сгенерил ты последовательность из триллиона триллионов паролей, но они последовательно идут, т.е. узнал сегодняшний - быстро подобрал вчерашний. Надо перемешивать или выбирать случайный, т.е. надо хранить все и удалять использованные.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810019
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один коммит на сегодня. Добавил поли-алфавитность. Теперь можно комбинировать множества
символов, цифирок и пунктуаций.

Типа:

Код: plaintext
1.
$ pwdgen 4 upper lower digit punct > 4symbol_pwds.lst
...
Рейтинг: 0 / 0
25 сообщений из 188, страница 4 из 8
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничный pwdgen
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]