powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничный pwdgen
188 сообщений из 188, показаны все 8 страниц
Тяпничный pwdgen
    #38806596
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так вот надо чтобы было.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
$ pwdgen [alpha] 2-3

aa
ab
ac
...
zzx
zzy
zzz



И чтоб букв было много. Не 3 а вобщем много.

Давайте. Кидайте идеи и сорцы. На сях.

С++ тоже приветствуется (как ни странно

P.S. С++11 ну это ваще респект будет.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38806698
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
$ python -c "import string;import random;print ''.join(random.choice(string.ascii_lowercase) for _ in range(random.choice([2, 3])))"
rkm
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38806739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорт. На сях давай.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38806827
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Парсить аргументы лень. Вот с прошитыми в коде параметрами.
С++ :)

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

char sym_set[] = "abcdefghijklmnopqrstuvwxyz";
size_t sym_set_size = sizeof(sym_set) - 1;
size_t min_len = 2;
size_t max_len = 3;

int main()
{
    std::vector<size_t> num;
    std::string symbols;
    // initial value
    num.resize(min_len, 0);
    symbols.resize(min_len, sym_set[0]);
    // increment while len within range
    while (symbols.size() <= max_len) {
        // print current value
        std::cout << symbols << std::endl;
        // num++; symbols++
        for (size_t i = num.size(); i != 0; --i) {
            size_t d = i - 1;
            ++num[d];
            if (num[d] < sym_set_size) {
                symbols[d] = sym_set[num[d]];
                break;
            }
            // carry
            num[d] = 0;
            symbols[d] = sym_set[0];
            if (d == 0) {
                // add a digit place for carry
                num.insert(num.begin(), 0);
                symbols.insert(symbols.begin(), sym_set[0]);
            }
        }
    }
    return 0;
}
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807095
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Пришёл только, я бы так делал

// help_Mark.cpp: определяет точку входа для консольного приложения.
//

Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* get_next_string(char* cur)
{
	size_t p=strlen(cur);
	int i=0;
	while(*(cur+p-1-i)=='z')
		*(cur+p-1-i++)='a';

	*(cur+p-1-i)+=1;
	return cur;
}

int view_all_combination(size_t p,FILE* out)
{
	char* start_s=(char*)malloc(sizeof(char)*(p+1));
	memset(start_s,'a',p);
	*(start_s+p)='\0';
	char* condition_s=(char*)malloc(sizeof(char)*(p+1));
	memset(condition_s,'z',p);
	*(condition_s+p)='\0';
	fprintf(out,"%s\n",start_s);
	while(strcmp(start_s,condition_s))
	{
		fprintf(out,"%s\n",get_next_string(start_s));
	}
	return 1;
}

int view_diap(int begin,int end,FILE* out)
{
	for(int i=begin;i<=end;++i)
		view_all_combination(i,out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out=fopen("output.txt","w");
	view_diap(1,4,out);
	fclose(out);
	return 0;
}
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807097
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неправильно делаю, что каждый раз считаю длину строки, надо передавать её. Один раз посчитать, а затем передавать.
писал в полной темноте, и у меня пол экрана не работает ( Потому и алгоритм Анатолия не понял, в понедельник прочитаю нормально. Доброго времени суток :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807346
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryписал в полной темноте, и у меня пол экрана не работает
Напомнило мне, как у меня 20 лет назад на ноуте в шине диска переломился проводник, и в каждом 16-битном слове считанном с жесткого диска один из битов был установлен в 1.
Поскольку денег на ремонт не было, а руки слишком кривы для паяльника, пришлось написать загрузчик,который не использовал этот бит в машинных инструкциях, и драйвер диска который переупаковывал биты отображая диск в виртуальный диск меньшего размера.

Ничего, нас ##ут, а мы крепчаем :)

ЗЫ. А где mayton? Свой вариант кто будет приводить? :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807410
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня щас вообще нет варианта. Но думаю сейчас сделаем гибрид из того что уже опубликовано. Если сообщество
не против
Чистить будем. У Толика - СТЛ. У Сашки - куча каких-то memcpy.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807449
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ чтоб букв было много. Не 3 а вобщем много.
Ты прикинул сколько комбинаций получается? Если только малые английские буквы то 26^N, где N количество символов. Например для 8 символов уже 208 миллиардов комбинаций.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonИ чтоб букв было много. Не 3 а вобщем много.
Ты прикинул сколько комбинаций получается? Если только малые английские буквы то 26^N, где N количество символов. Например для 8 символов уже 208 миллиардов комбинаций.
Да.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807452
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Вот без СТЛ, на чистом С :)

Код: 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.
void gen_pass_c()
{
    char sym_set[] = "abcdefghijklmnopqrstuvwxyz";
    size_t sym_set_size = sizeof(sym_set) - 1;
    size_t min_len = 8;
    size_t max_len = 8;

    size_t progress = 0;
    size_t num_size = min_len;
    size_t* num =  (size_t*)malloc(num_size * sizeof(size_t));
    char* symbols = (char*)malloc((num_size + 1) * sizeof(char));
    // initial value
    memset(num, 0, num_size * sizeof(num[0]));
    memset(symbols, sym_set[0], num_size * sizeof(symbols[0]));
    symbols[num_size] = 0;
    // increment while len within range
    while (num_size <= max_len) {
        // print current value
        //puts(symbols);
        //putchar('\n');
        if ((progress & 0xFFFFFF) == 0)
           fprintf(stderr, "%lu\n", progress);
        // num++; symbols++
        for (size_t i = num_size; i != 0; --i) {
            size_t d = i - 1;
            ++num[d];
            if (num[d] < sym_set_size) {
                symbols[d] = sym_set[num[d]];
                break;
            }
            // carry
            num[d] = 0;
            symbols[d] = sym_set[0];
            if (d == 0) {
                // add a digit place for carry
                num_size++;
                num = (size_t*)realloc(num, num_size * sizeof(size_t));
                memmove(num + 1, num, (num_size - 1) * sizeof(size_t));
                symbols = (char*)realloc(symbols, (num_size + 1) * sizeof(char) );
                memmove(symbols + 1, symbols, (num_size - 1) * sizeof(char));
            }
        }
        progress++;
    }
}



Без вывода сгенерированных паролей и с выводом в /dev/null получаются такие скорости:
С++: 120 Мп/сек / 2.2 Мп/сек
С (моя): 375 Мп/сек /19 Мп/сек
С (Саши): 40 Мп/сек / 5.5 Мп/сек (подозреваю что strlen и printf тормозят)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807455
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, круть! Спс.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807463
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе мой вариант
Код: 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.
#include <windows.h>
#include <stdio.h>

char simb_first = 'a'; // Код первого допустимого символа
char simb_last = 'z'; // Код последнего допустимого символа

void perebor(int N) // все комбинации N символов
{
	// Инициализанция
	char* buf = (char*)malloc(N + 1);
	memset(buf, simb_first, N);
	buf[N] = 0;
	char* last = buf + (N - 1);
	// Перебор
	char* cur = last;
	bool istcho = true;
	while(istcho) {
		printf("%s\n", buf);
		// следующая комбинация
		cur = last;
		do { 
			(*cur)++;
			if(*cur <= simb_last) {
				break;
			} else {
				*cur = simb_first;
				cur--;
				if(cur < buf) {
					// все варианты перебраны
					istcho = false;
					break;
				}
			}
		} while(true);
	}
	free(buf);
}

int main(int argc, char* argv[])
{
	for(int i = 2; i <= 3; i++) {
		perebor(i);
	}
	system("pause");
    return 0;
}

...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807469
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Код: plaintext
1.
2.
3.
4.
5.
6.
    while (num_size <= max_len) {
...
        for (size_t i = num_size; i != 0; --i) {
...
                num = (size_t*)realloc(num, num_size * sizeof(size_t));
...



Без вывода сгенерированных паролей и с выводом в /dev/null получаются такие скорости:
...
realloc() тоже тормозит, можно сразу выделить необходимый кусок памяти.
Для комбинации N штук из M видов символов надо N*M^N байт, т.е. малые английские буквы 2-3 штуки = 2*26^2 + 3*26^3
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807477
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

В моем алгоритме realloc вызывается с десяток раз максимум (макс размер пароля).
Поэтому тормозит ли он совершенно неважно :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807510
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807628
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nik_x,

Тут немного другое требуется.
Вместо того чтобы сгенерировать ровно один случайный пароль, как делает эта программа (и однострочник в первом ответе), надо сгенерировать ВСЕ пароли из заданного множества.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807739
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

вот вариант исключающий ту ошибку, о которой я писал ранее



Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* get_next_string(char* cur,size_t p)
{
	int i = 0;
	while (*(cur + p - 1 - i) == 'z')
		*(cur + p - 1 - i++) = 'a';

	*(cur + p - 1 - i) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(start_s, 'a', p);
	*(start_s + p) = '\0';
	char* condition_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(condition_s, 'z', p);
	*(condition_s + p) = '\0';
	fprintf(out, "%s\n", start_s);
	while (strcmp(start_s, condition_s))
	{
		fprintf(out, "%s\n", get_next_string(start_s,p));
	}
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 4, out);
	fclose(out);
	return 0;
}



но тут ещё можно оптимизировать. Сейчас
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807742
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так можно.

Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* set_next_string(char* cur,size_t p)
{
	while (*(cur + p - 1) == 'z')	
		*(cur + p-- - 1) = 'a';

	*(cur + p - 1) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(start_s, 'a', p);
	*(start_s + p) = '\0';
	char* condition_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(condition_s, 'z', p);
	*(condition_s + p) = '\0';
	
	fprintf(out, "%s\n", start_s);
	while (strcmp(start_s, condition_s))
	{
		fprintf(out, "%s\n", set_next_string(start_s,p));
	}
	free(start_s);
	free(condition_s);
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 4, out);
	fclose(out);
	return 0;
}



Анатолий, вы можете ещё раз пожалуйста проверить на скорость ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807749
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объединил стартовое значение и условие выхода в одну строку, чтобы операций аллоцирования и освобождения памяти было меньше. Всё, больше оптимизировать не буду, осталось одно узкое место, очевидно strcmp. Думаю, нужно это вопрос по другому решать, т.е. запускать программу, но проверку на завершение программы не делать, а проверять например размер файла, каждую секунду (нужно провести оценку размера файла, от диапазона). Только как это сделать, я не знаю. А вот функцию вполне могу составить. Как вы считаете, такое предложение имеет место быть ?

Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* set_next_string(char* cur,size_t p)
{
	while (*(cur + p - 1) == 'z')	
		*(cur + p-- - 1) = 'a';

	*(cur + p - 1) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_and_condition = (char*)malloc((p + 1)*2);
	memset(start_and_condition, 'a', p);//стартовое значение
	*(start_and_condition + p) = '\0';
	char* start_s = start_and_condition;
	memset(start_and_condition+p+1, 'z', p);//условие выхода
	*(start_and_condition + 2 *p + 1) = '\0';
	char* condition_s = start_and_condition + p + 1;
	
	fprintf(out, "%s\n",start_and_condition);
	while (strcmp(start_s, condition_s))
	{
		fprintf(out, "%s\n", set_next_string(start_s,p));
	}
	free(start_and_condition);
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 4, out);
	fclose(out);
	return 0;
}



Займусь наконец алгоритмами Анатолий и Дмитрия C:
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807751
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSА вот функцию вполне могу составить
которая будет определять размер файла, в зависимости от диапазона.

SSЗаймусь наконец алгоритмами Анатолия и Дмитрия
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807766
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void perebor(int N) // все комбинации N символов
{
	// Инициализанция
	char* buf = (char*)malloc(N + 1);
        char* last = buf + (N - 1);
	// Перебор
	char* cur = last;
	
...			
	if(cur < buf) 
}



такая операция законна ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807783
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

теперь я понял почему вы использовали частные случаи fputs и putc, они быстрее чем fprintf
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807785
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryтакая операция законна ?
Что незаконного? Сравнение значений двух указателей.
Без разницы как перебирать массив: от начала к концу и проверять выход за конец или наоборот, он конца к началу и проверять выход перед началом.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807792
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

мне показалось, что это выражение будет истинным, когда cur не будет принадлежать массиву buf. Потому я и спросил, законно ли сравнивать указатели принадлежащие разным кускам памяти
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807798
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗаймусь наконец алгоритмами Анатолий и Дмитрия C:
Раз уж изучать собрался, то замени в моем коде
perebor(int N)
Код: 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.
void perebor(int N) // все комбинации N символов
{
	// Инициализанция
	char* buf = (char*)malloc(N + 1);
	memset(buf, simb_first, N);
	buf[N] = 0;
	char* last = buf + (N - 1); // указатель на последний символ (младший разряд)
	// Перебор
	bool istcho = true;
	while(istcho) {
		printf("%s\n", buf);
		// следующая комбинация
		char* cur = last;
		while(true) { 
			(*cur)++;
			if(*cur <= simb_last) {
				break;
			} else {
				*cur = simb_first;
				cur--;
				if(cur < buf) {
					// все варианты перебраны
					istcho = false;
					break;
				}
			}
		}
	}
	free(buf);
}


Небольшие косметические изменения, для улучшения читабильности.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807800
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий ваш код я уже изучил, и уже использовал вашу идею в оптимизированном алгоритме :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807804
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima T,

мне показалось, что это выражение будет истинным, когда cur не будет принадлежать массиву buf.
все верно, именно это и проверяется
SashaMercuryПотому я и спросил, законно ли сравнивать указатели принадлежащие разным кускам памяти
Нельзя сравнивать указатели на элементы разных массивов. В данном случае массив один, т.е. один кусок памяти.

В принципе можно это
Код: plaintext
1.
2.
3.
cur--;
if(cur < buf) {
...}


заменить на
Код: plaintext
1.
2.
3.
if(cur == buf) {
...}
cur--;


perebor(int N) целиком
Код: 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.
void perebor(int N) // все комбинации N символов
{
	// Инициализанция
	char* buf = (char*)malloc(N + 1);
	memset(buf, simb_first, N);
	buf[N] = 0;
	char* last = buf + (N - 1); // указатель на последний символ (младший разряд)
	// Перебор
	bool istcho = true;
	while(istcho) {
		printf("%s\n", buf);
		// следующая комбинация
		char* cur = last;
		while(true) { 
			(*cur)++;
			if(*cur <= simb_last) {
				break;
			} else if(cur == buf) {
				// все варианты перебраны
				istcho = false;
				break;
			} else {
				*cur = simb_first;
				cur--;
			}
		}
	}
	free(buf);
}

...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807809
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TНельзя сравнивать указатели на элементы разных массивов. В данном случае массив один, т.е. один кусок памяти.
но если cur будет меньше начала массива buf, то cur не будет принадлежать этому массиву, значит сравниваются начало массива, и элемент не принадлежащий ему. Разве не так ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807810
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот конечный вариант, с использованием идеи Дмитрия по окончанию всех вариантов(только модифицированная идея, выделил желтым), и предложения Анатолия использовать fputs вместо printf. Осталось избавить от аллоцирования, нужно делать так, чтобы стартовая строка появлялась с использованием макроса, если это возможно.

Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//функция принимает строку, и устанавливает её в следующее значение.
//если функция возвращает NULL значит варианты закончились
char* set_next_string(char* cur, size_t p)
{
	while (*(cur + p - 1) == 'z')
		*(cur + p-- - 1) = 'a';
	if (p == 0)
		return NULL;
	
	*(cur + p - 1) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_s = (char*)malloc(p + 1);
	memset(start_s, 'a', p); *(start_s + p) = '\0'; //установка стартового значения
	do	//вывод в поток out всех вариантов
	{
		fputs(start_s, out);
		putc('\n', out);
	} while (set_next_string(start_s, p));

	free(start_s);
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 6, out);
	fclose(out);
	return 0;
}
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807815
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
В принципе можно это
Код: plaintext
1.
2.
3.
cur--;
if(cur < buf) {
...}


заменить на
Код: plaintext
1.
2.
3.
if(cur == buf) {
...}
cur--;




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

cur это переменная хранящая адрес в памяти, который (по условиям алгоритма) должен указывать на элемент массива (проверяется что он не указывает). При этом cur может указывать за пределы массива - это не криминал, криминал прочитать/записать по адресу за пределами массива, т.е. нельзя использовать *cur когда cur указывает за пределы массива, но при этом можно использовать содержимое переменной cur.

Понятно или с картинками объяснить? Это надо четко понимать при работе с указателями.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807831
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryпропущено...

но если cur будет меньше начала массива buf, то cur не будет принадлежать этому массиву, значит сравниваются начало массива, и элемент не принадлежащий ему. Разве не так ?
У тебя путаница в голове: cur это не элемент массива, а указатель на элемент массива (адрес в памяти), т.е. сравниваются адрес записанный в cur и адрес начала массива. Обращение к памяти по этим адресам не происходит.

cur это переменная хранящая адрес в памяти, который (по условиям алгоритма) должен указывать на элемент массива (проверяется что он не указывает). При этом cur может указывать за пределы массива - это не криминал, криминал прочитать/записать по адресу за пределами массива, т.е. нельзя использовать *cur когда cur указывает за пределы массива, но при этом можно использовать содержимое переменной cur.

Понятно или с картинками объяснить? Это надо четко понимать при работе с указателями.

Такой участок кода имеет место быть ?
Код: plaintext
1.
2.
char* buf = (char*)malloc(sizeof(char)* 10);
char* temp = buf - 10;
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807836
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TПонятно или с картинками объяснить? Это надо четко понимать при работе с указателями.

Дмитрий, я всё это прекрасно понимаю, Сообщество, и вы в том числе этому меня научили :)

K&R p.104Если P и Q указывают на
элементы одного и того же массива, то такие отношения, как <, >= и т.д., работают
надлежащим образом. Например,
P < Q
истинно, если P указывает на более ранний элемент массива, чем Q. Отношения == и
!= тоже работают. Любой указатель можно осмысленным образом сравнить на
равенство или неравенство с NULL. Но ни за что нельзя ручаться, если вы используете
сравнения при работе с указателями, указывающими на разные массивы. Если вам
повезет, то на всех машинах вы получите очевидную бессмыслицу. Если же нет, то
ваша программа будет правильно работать на одной машине и давать непостижимые
результаты на другой.

Diomidis Spinellis Code Reading: The Open Source PerspectiveNote that, although it is illegal to access elements outside those prescribed by an array's limits, ANSI C
and C++ allow the calculation of the address of the element immediately after the array's end. Calculating
the address of any other element outside the array limits is illegal and can lead to undefined behavior in
some architectures even if no actual access takes place. The address of the element beyond the end is
used as an indicator for marking the end of the range and iterating through it.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807850
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТакой участок кода имеет место быть ?
Код: plaintext
1.
2.
char* buf = (char*)malloc(sizeof(char)* 10);
char* temp = buf - 10;


Теоретически да, но практически это потенциальная трудноотлавливаемая ошибка, если далее ошибочно будет использовано *temp и по этому адресу окажется реальная память.
При инициализации лучше использовать NULL, чтобы при ошибочном обращении гарантированно была ошибка обращения к несуществующей памяти.
Код: plaintext
1.
char* temp = NULL;



Если много вычесть, могут проблемы возникнуть. Запусти
Код: plaintext
1.
2.
3.
char* buf = (char*)malloc(sizeof(char)* 10);
char* temp = buf - 100000000;
printf(temp < buf ? "true\n" : "false\n");
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807900
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что вы говорите следующее. Пусть x имеет тим size_t, тогда для следующего участка кода

Код: plaintext
1.
2.
3.
4.
char* buf = (char*)malloc(sizeof(char)* 10);
char* temp = buf - x;//(1)
if(temp < buf) //(2)
...



строчки 1 и 2 будут корректны если x будет в диапазоне от 1 до 5, а если x>1000 то строчки 1 и 2 некорректны и мы можем наблюдать undefined behaviour. Я вам говорю, что в любом случае мы наблюдаем undefined behaviour, и привожу ссылки на K&R и Спинеллиса. Не говорю, что вы не правы, но пока я с вами не согласен
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808119
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого сколько тут читать.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808128
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryОсталось избавить от аллоцирования
Надо понимать, где остановиться оптимизируя код.
Данная оптимизация не даст никакого прироста скорости, потому что на 100 млрд итераций несколько аллокаций никак не повлияют, а код наверняка будет хуже читаться.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808130
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
char* buf = (char*)malloc(sizeof(char)* 10);
char* temp = buf - 10;


Я-бы так никогда не делал. Это за пределами аллоцированной памяти. Разные среды ведут
себя по разному в таком кейсе при попытке чтения/записи по указателю temp. В хорошем
варианте мы получит немедленный лопух с сообщением типа Segfault или "Программа выполнила
недопустимую...".

В плохом варианте мы будем очень долго и глючно работать пока разработчика не накажут
коллеги за лень и глупость или проклянёт заказчик, или будет пробита карма, или всемогущий
покарает болезнями и смертью.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808234
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ключевая мысль твоей цитаты:
SashaMercuryK&R p.104... Но ни за что нельзя ручаться, если вы используете
сравнения при работе с указателями, указывающими на разные массивы. ...
Она про другое. В данном случае проверка выхода за пределы массива. И это не означает что там другой массив (там неизвестно что), это просто выход за пределы, не более того.
SashaMercuryМне кажется, что вы говорите следующее. Пусть x имеет тим size_t, тогда для следующего участка кода

Код: plaintext
1.
2.
3.
4.
char* buf = (char*)malloc(sizeof(char)* 10);
char* temp = buf - x;//(1)
if(temp < buf) //(2)
...



строчки 1 и 2 будут корректны если x будет в диапазоне от 1 до 5, а если x>1000 то строчки 1 и 2 некорректны и мы можем наблюдать undefined behaviour.
В данном случае (если x любое число) для 100% уверенности можно проверять обе границы, т.е. temp за пределами массива buf[10] проверяется так
Код: plaintext
1.
if(temp < buf || temp >= buf + 10) 


адрес buf гарантированно больше 0, т.к. по адресу 0 (он же NULL) нет реальной памяти, сделано специально чтобы инициализировать указатели "в никуда" значением NULL, для виндовса это адреса 0 - 65535 (для линукса 0-16777215 если не путаю), т.е. в твоем примере можно получить неопределенность при x>65535 (это минимум, реально еще больше).

т.е. при x < 65535 можно упростить проверку до if(temp < buf)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808252
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury
Код: plaintext
1.
2.
char* buf = (char*)malloc(sizeof(char)* 10);
char* temp = buf - 10;


Я-бы так никогда не делал.
это родилось для обобщения правомерности применения конструкции
Код: plaintext
1.
if(temp < buf) //(2)


читай сначала :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808393
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tmaytonпропущено...

Я-бы так никогда не делал.
это родилось для обобщения правомерности применения конструкции
Код: plaintext
1.
if(temp < buf) //(2)


читай сначала :)
Это неважно. Про связь массивов и указателей все знают. Значит делать можно сравнения
в диапазоне аллоцированной памяти элементов массива.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808484
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, я рад что вы меня поняли.

У нас есть участок кода:
Код: plaintext
1.
2.
3.
T* buf=(T*)malloc(sizeof(T)*100);
T* a1=buf-1;
T* a2=buf-1000000;



Дмитрий, я вас правильно понимаю, вы говорите, buf можно сравнить с a1, но если сравнивать с a2, мы имеем undefined behaviour ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808485
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто неважно. Про связь массивов и указателей все знают. Значит делать можно сравнения
в диапазоне аллоцированной памяти элементов массива.
см. выше, речь о такой конструкции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
char buf[3] = "aa";
{
  char* cur = buf + 1;
  while(true) {
    ... работаем с *cur
    cur--;
    if(cur < buf) {
      break;
    }
    ...
  }
}


после break следующая } закрывает область видимости cur, т.е. обращение к *cur невозможно.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808497
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryОсталось избавить от аллоцирования
Надо понимать, где остановиться оптимизируя код.
Данная оптимизация не даст никакого прироста скорости, потому что на 100 млрд итераций несколько аллокаций никак не повлияют, а код наверняка будет хуже читаться.

Догадался ) Последний код в моем последнем сообщении с кодом. Вы можете проверить его на скорость пожалуйста ?
код
Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//функция принимает строку, и устанавливает её в следующее значение.
//если функция возвращает NULL значит варианты закончились
char* set_next_string(char* cur, size_t p)
{
	while (*(cur + p - 1) == 'z')
		*(cur + p-- - 1) = 'a';
	if (p == 0)
		return NULL;
	
	*(cur + p - 1) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_s = (char*)malloc(p + 1);
	memset(start_s, 'a', p); *(start_s + p) = '\0'; //установка стартового значения
	do	//вывод в поток out всех вариантов
	{
		fputs(start_s, out);
		putc('\n', out);
	} while (set_next_string(start_s, p));

	free(start_s);
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 6, out);
	fclose(out);
	return 0;
}


PS По вашему алгоритму у меня остались вопросы, но я ещё подумаю. Кстати, а как вам идея "выключать" программу через определенное время, или когда файл будет определенного размера ? Мы исключили бы постоянную проверку, и проверяли бы размер файла, каждые 5 минут например(это сгодится при размере пароля более 10 символов, например)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808503
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
речь идёт о такой конструкции .

SashaMercuryDima T
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void perebor(int N) // все комбинации N символов
{
	// Инициализанция
	char* buf = (char*)malloc(N + 1);
        char* last = buf + (N - 1);
	// Перебор
	char* cur = last;
	
...			
	if(cur < buf) 
}



такая операция законна ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808511
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем ладно, не хватало чтобы мы ещё тут поругались. Я подумаю, над вашими идеями, возможно я их просто не понимаю . Ваша идея хорошая, и мне понятна, я её использовал в конечной версии программы. Спасибо C: и спасибо за код, мне было интересно его читать(я даже пил компот, и разбирал его) :)

PS Код Анатолия ещё не разобрал, как писал раньше, потому отпишу позже.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808512
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSВаша идея хорошая
идея, как понять, что дальше не нужно двигать стрелку, она очевидно лучше и быстрее(в общем случае) постоянного сравнения через strcmp.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808513
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymayton, я рад что вы меня поняли.

У нас есть участок кода:
Код: plaintext
1.
2.
3.
T* buf=(T*)malloc(sizeof(T)*100);
T* a1=buf-1;
T* a2=buf-1000000;



Дмитрий, я вас правильно понимаю, вы говорите, buf можно сравнить с a1, но если сравнивать с a2, мы имеем undefined behaviour ?
Неправильно. Это проверка на выход за пределы массива.
Полная проверка выглядит так
Код: plaintext
1.
if(a2 < buf || a2 >= buf + 100)


но если заранее известно что шаги короткие, то можно упростить сравнение до
Код: plaintext
1.
if(a1 < buf)


При большом смещении упрощать нельзя, т.к. указатель это не что иное как адрес с типом беззнаковое целое, т.е. твое вычитание вызывает переполнение, равносильно такому
Код: plaintext
1.
2.
unsigned int buf = 123456;
unsigned int a2 = buf-1000000; // = 2^32 - 1 000 000 + 123 456 = ~4 000 000 000
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808521
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Почему-то напомнился сабж о выделении массивов с "хвостиками".
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808612
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, SashaMercury

Согласно стандарту, указатель может указывать либо в аллоцированный объект, либо сразу за (в следующий за объектом байт).
(Если платформа не позволяет хранить указатели за пределы выделенной памяти, то имплементация должна выделять на 1 байт больше)

Все операции, в результате которых получаются указатели за пределами какого либо выделенного объекта (перед либо более 1 байта после) - это UB. Как и сравнение <, > с такими указателями



SashaMercuryВы можете проверить его на скорость пожалуйста ?
Не, мне уже некогда. Разрешаю вам
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808650
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВообщем ладно, не хватало чтобы мы ещё тут поругались.
Не будем мы ругаться, не переживай :)

Я тебя к другому пытаюсь подвести. У меня такое впечатление что ты сам себе поставил ограничение "указатель = массив" и пользуешься указателями только как альтернативным синтаксисом массивов. Но указатель это больше чем массив.
Например твой код выше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* set_next_string(char* cur, size_t p)
{
	while (*(cur + p - 1) == 'z')
		*(cur + p-- - 1) = 'a';
	if (p == 0)
		return NULL;
	
	*(cur + p - 1) += 1;
	return cur;
}


По сути нормально писать так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* set_next_string(char* start, size_t size)
{
	while (start[size - 1] == 'z')
		start[size-- - 1] = 'a';
	if (size == 0)
		return NULL;
	
	start[size - 1] += 1;
	return start;
}


Согласись что так лучше читается. Дополнительно заменил cur на start, т.к. название должно соответствовать смыслу. cur от current.
Это уже так, придирки, суть в том что этот код и твой скомпилируются в одно и тоже, т.е. с кучей лишних вычислений.

С указателями можно сделать тоже самое, но меньшим количеством операций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
char* set_next_string(char* start, size_t size)
{
	char* cur = start + size - 1;
	while (*cur == 'z') 
		*cur-- = 'a';

	if (cur < start) 
		return NULL;
	
	(*cur)++;
	return start;
}


заметь на сколько меньше разных + - по сравнению с твоим кодом. Можно еще переделать чтобы в параметрах был указатель на конец строки (start + size - 1), тогда его не надо будет считать каждый раз.



В данном случае еще нет лишних умножений, т.к. sizeof(char) = 1, если тип будет не char, а, например, int, то в реальности будет следующее, например код:
Код: plaintext
1.
2.
3.
4.
int a[10];
for(int i = 10 - 1; i >= 0; i--) {
    printf("%d\n", *(a + i));
}


Реальные вычисления на каждом проходе цикла:
1. уменьшение i
2. вычисление адреса (a + i). Происходит так: адрес a + i * 4 байта (4 это sizeof(int))

если переписать указателями, то будет так
Код: plaintext
1.
2.
3.
for(int* i = a + 10 - 1; i >= a; i--) {
    printf("%d\n", *i);
}


тут только i-- что в реале произойдет как i -= 4 байта

Вот в чем одно из основных преимуществ указателей над массивами.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808755
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, у тебя ошибка в коде set_next_string(), в т.ч. в моих реинкарнациях.
Запусти этот код и подумай как исправить.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int main(int argc, char* argv[])
{
	char buf[] = "zzz";
	printf("%c\n", buf[0]);
	set_next_string(&buf[1], 2);
	printf("%c\n", buf[0]);
	system("pause");
	return 0;
}


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

Вот что есть на данный момент. Можете править Just For Fun.

Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 17.11.2014 (Mayton) - added stuped startup. WTF? Pwd generator! Just for fun. */
/*                       TODO: Add capital Alpha, and Numeric support            */
/*                       TODO: Make marginal tests. Overflow. Plattform compatibility */


static char *buf;

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';
		// TODO: Remove slowpok printf! Improove speed! 
		printf("%s\n",buf);
        }
}

int paLaunch(char *a,int m){
	pa(a,strlen(a),0,m);
}


// TODO: Support Unicde. Support National codepages.

char *alpha        = "abcdefghijklmnopqrstuvwxyz";

char *capitalAlpha = "ABCDEFGHIJLKMNOPQRSTUVWXWY";

char *num          = "0123456789";




int main(int argc,char **arg, char **env){
                                                                                                a
	if (argc==1) {
		fprintf(stderr,"\nPassword Generation 1.0 (c) Mayton and SQL.RU. Written in 'C' :)\n");
		fprintf(stderr,"Special thnx to: Sasha Mercury, Anatoly Moskovsky, Dima T.\n");
		fprintf(stderr,"\nUsage: pwdgen [m] \n\n");
		return -1;
	} else {
		int m = atoi(arg[1]);
		if (m>0){
			buf=malloc(22);
			paLaunch(alpha,m);
			free(buf);
			return 0;
		} else {
			fprintf(stderr,"\nArgument cannot be less than 0 or NaN!\n");
			return -2;
		}
		
	}

}                                                       
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808945
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

а чё ты с юникодом задумал?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808946
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Некоторые пассажиры колотят национальные буквочки.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808954
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНекоторые пассажиры колотят национальные буквочки.
не беспокоит, что их несколько десятков тысяч?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38808958
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно бох с ним. Не надо Юникод. Прошу потестить у кого под рукой есть Пингвин и Чорт в кедах.

А я пока на Windows7+GCC на ноуте.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809033
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.
char sym_set[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJLKMNOPQRSTUVWXWY0123456789";

char num[256];
size_t len;

size_t sym_set_size;
size_t min_len = 8;
size_t max_len = 8;

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

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

        i++;
    }while(carry);


    if(i > len) len=i;
}
//////////////////////////////////////////
void print_num()
{
    size_t i = 0;
    while(num[i])
        cout<<sym_set[ num[i++] - 1 ];

    cout<<endl;
}
//////////////////////////////////////////
int main()
{
    memset(num, 0, sizeof(num));
    memset(num, 1, min_len);
    len = min_len;
    sym_set_size = strlen(sym_set);

    while(len <= max_len)
    {
            print_num();
            add_num();
    }

    return 0;
}
//////////////////////////////////////////


...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809191
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот что есть на данный момент. Можете править Just For Fun.
Сам правь, не компилируется.

ИМХУ Рекурсия тут хорошо подходит, но накладных расходов у нее много, не производительно это.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809244
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу под "main" лишняя буковка. Ладно хрен с ним. Допилю еще два alphabet - выложу.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809401
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хех... запилил алфавиты. Взял названия из POSIX-like шаблонов регулярок. Теперь мысль - комбинировать наборы.
Пунктуации + Цифирки. Или наоборот. Или обеспечить начало с альфа-символа а потом цифирки.

Вобщем тестируйте. Предлагайте.

Код: 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.
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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 17.11.2014 (Mayton) - added stuped startup. WTF? Pwd generator! Just for fun. */
/*                       TODO: Make marginal tests. Overflow. Plattform compatibility */
/* 18.11.2014 (Mayton) - added POSIX-like Character classes. Fixed some bugs. Improoved code design */
/*                       TODO: Add aility to Make multiple choose of charsets. Make charsets unique */
/*                       TODO: Add interval of length like m-n */


static char *buf;

static char *alphabet;

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);
        }
}

int paLaunch(char *a,int m){
	pa(a,strlen(a),0,m);
}


char *alpha        = "abcdefghijklmnopqrstuvwxyz";

char *upper        = "ABCDEFGHIJLKMNOPQRSTUVWXWY";

char *xdigit       = "0123456789ABCDEF";

char *digit        = "0123456789";

char *punct        = "!@#$%^&*()-=_+,./?~`\\|";

// TODO: Make unique. For ex: ALPHA is union of LOWER and UPPER.

/*#define ALNUM 0x0
#define ALPHA 0x1
#define LOWER 0x2
#define PUNCT 0x3
#define UPPER 0x4
#define XDIGIT 0x5
#define DIGIT 0x6*/

int main(int argc,char **arg, char **env){
                                                                                                
	if (argc==1) {
		fprintf(stderr,"\nPassword Generation 1.1 (c) Mayton and SQL.RU. Written in 'C' :)\n");
		fprintf(stderr,"Special thnx to: Sasha Mercury, Anatoly Moskovsky, Dima T.\n");
		fprintf(stderr,"\nUsage: pwdgen [m] [options..] \n");
		fprintf(stderr,"\nWhere: options:\n");
		fprintf(stderr,"\n       alnum  - Alphanumeric characters [A..z] and [a..z] and [0..9]");
		fprintf(stderr,"\n       alpha  - Alphabetic characters [A..z] and [a..z]");
		fprintf(stderr,"\n       lower  - Lowercase alphabetic characters [a..z]");
		fprintf(stderr,"\n       punct  - Punctuation characters [,!?..]");
		fprintf(stderr,"\n       upper  - Uppercase alphabetic characters [A..Z]");
		fprintf(stderr,"\n       xdigit - Hexidecimal characters");
		fprintf(stderr,"\n       digit  - Numeric digits [0..9]");
		fprintf(stderr,"\n");
		return -1;
	} else {
		int m = 0;
		m = atoi(arg[1]);
		if (m > 0){ 
			if (argc==2) {
		        	buf = malloc(m + 1);
				paLaunch(alpha,m);
				free(buf);
				return 0;
                        } else {
				int optionDetect=0;
				alphabet = malloc(strlen(alpha)+strlen(upper)+strlen(xdigit)+strlen(digit)+strlen(punct)+1);
				alphabet[0]='\0';
				if (0==strcmp(arg[2],"lower")){
					strcat(alphabet,alpha);
					optionDetect=1;
				} else if (0==strcmp(arg[2],"alnum")){
					strcat(alphabet,alpha);
					strcat(alphabet,upper);
					strcat(alphabet,digit);
					optionDetect=1;
				} else if (0==strcmp(arg[2],"punct")){
					strcat(alphabet,punct);
					optionDetect=1;
				} else if (0==strcmp(arg[2],"alpha")){
					strcat(alphabet,alpha);
					strcat(alphabet,upper);
					optionDetect=1;
				} else if (0==strcmp(arg[2],"digit")){
					strcat(alphabet,digit);
					optionDetect=1;
				} else if (0==strcmp(arg[2],"upper")){
					strcat(alphabet,upper);
					optionDetect=1;
				} else if (0==strcmp(arg[2],"xdigit")){
					strcat(alphabet,xdigit);
					optionDetect=1;
				}

				if (!optionDetect) {
					fprintf(stderr,"Unrecognized option!");
					return -3;
				}
		        	buf = malloc(m + 1);
				paLaunch(alphabet,m);
				free(buf);
				free(alphabet);
				return 0;
			}
		} else {
			fprintf(stderr,"\nArgument cannot be less than 0 or not a number!\n");
			return -2;
		}
		
	}

}                            
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809450
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDima T, SashaMercury

Согласно стандарту, указатель может указывать либо в аллоцированный объект, либо сразу за (в следующий за объектом байт).
(Если платформа не позволяет хранить указатели за пределы выделенной памяти, то имплементация должна выделять на 1 байт больше)

Все операции, в результате которых получаются указатели за пределами какого либо выделенного объекта (перед либо более 1 байта после) - это UB. Как и сравнение <, > с такими указателями



SashaMercuryВы можете проверить его на скорость пожалуйста ?
Не, мне уже некогда. Разрешаю вам

по сути, то что я и говорил. Сегодня думал, а возможно ли вообще написать функцию, которая определяет принадлежит ли данный адрес, адресам выделенного участка памяти. Вероятно нельзя(возможно только полным перебором всех адресов, и то не факт)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809469
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryвозможно ли вообще написать функцию, которая определяет принадлежит ли данный адрес, адресам выделенного участка памятипамять линейна, вообще то. Берёшь в руки операторы сравнения, начало и конец выделенного участка и тестируемый указатель, и вуаля! - функция написана за 4 секунды )))
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809475
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryВообщем ладно, не хватало чтобы мы ещё тут поругались.
Не будем мы ругаться, не переживай :)

Я тебя к другому пытаюсь подвести. У меня такое впечатление что ты сам себе поставил ограничение "указатель = массив" и пользуешься указателями только как альтернативным синтаксисом массивов. Но указатель это больше чем массив.
Например твой код выше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* set_next_string(char* cur, size_t p)
{
	while (*(cur + p - 1) == 'z')
		*(cur + p-- - 1) = 'a';
	if (p == 0)
		return NULL;
	
	*(cur + p - 1) += 1;
	return cur;
}


По сути нормально писать так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* set_next_string(char* start, size_t size)
{
	while (start[size - 1] == 'z')
		start[size-- - 1] = 'a';
	if (size == 0)
		return NULL;
	
	start[size - 1] += 1;
	return start;
}


Согласись что так лучше читается. Дополнительно заменил cur на start, т.к. название должно соответствовать смыслу. cur от current.
Это уже так, придирки, суть в том что этот код и твой скомпилируются в одно и тоже, т.е. с кучей лишних вычислений.

мне мой вариант больше нравится. Тем более size не самое хорошее название, ибо у нас сливается указатель(длинный идентификатор) и его длина. Длину лучше обозначать одним символом (это я для себя решил)

Dima TС указателями можно сделать тоже самое, но меньшим количеством операций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
char* set_next_string(char* start, size_t size)
{
	char* cur = start + size - 1;
	while (*cur == 'z') 
		*cur-- = 'a';

	if (cur < start) 
		return NULL;
	
	(*cur)++;
	return start;
}


заметь на сколько меньше разных + - по сравнению с твоим кодом. Можно еще переделать чтобы в параметрах был указатель на конец строки (start + size - 1), тогда его не надо будет считать каждый раз.

Согласен, тут ваш код лучше. Спасибо :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809483
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

не думаю так. Вы же видели, что Anatoly Moskovsky подтвердил мои рассуждения, причём сослался на стандарт. Если адрес не принадлежит тем адресам, по которым выделена память, то мы получаем undefined behaviour, потому, если мы получаем истинный результат, не факт что он действительно истинный. Хотя если получаем ложный, то наверняка знаем что он ложный. Интересное свойство. Как оно правильно называется в IT ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809507
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercury, у тебя ошибка в коде set_next_string(), в т.ч. в моих реинкарнациях.
Запусти этот код и подумай как исправить.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int main(int argc, char* argv[])
{
	char buf[] = "zzz";
	printf("%c\n", buf[0]);
	set_next_string(&buf[1], 2);
	printf("%c\n", buf[0]);
	system("pause");
	return 0;
}


Нехорошая ошибка, т.к. будет происходить очень редко, поэтому ловить такие ошибки очень тяжело.

завтра на нормальном мониторе проверю уже.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809550
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych,

не думаю так. Вы же видели, что Anatoly Moskovsky подтвердил мои рассуждения, причём сослался на стандарт. Если адрес не принадлежит тем адресам, по которым выделена память, то мы получаем undefined behaviour, потому, если мы получаем истинный результат, не факт что он действительно истинный. Хотя если получаем ложный, то наверняка знаем что он ложный. Интересное свойство. Как оно правильно называется в IT ?
Наука есть такая. Fuzzy logic. Нечёткая логика. В ней обычно оперируют понятиями истин с вероятностью.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809570
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ Рекурсия тут хорошо подходит, но накладных расходов у нее много, не производительно это.
Два дня думаю над сохранением состояния. В случае если юзер нажал Ctrl+C или тикнул таймер (раз
в минуту) приложение должно писать состояние своей FSM в какой-нить файл типа
/var/run/pwdgen.fsm.

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

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

Вобщем это пока предмет основных моих размышлений.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809645
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, изучил немного ваш код. А где перебор то ?) или пока ещё нет
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809651
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TИМХУ Рекурсия тут хорошо подходит, но накладных расходов у нее много, не производительно это.
Два дня думаю над сохранением состояния. В случае если юзер нажал Ctrl+C или тикнул таймер (раз
в минуту) приложение должно писать состояние своей FSM в какой-нить файл типа
/var/run/pwdgen.fsm.


речь идёт о том что варианты будут генерироваться не все сразу, а за несколько запусков ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809661
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonпропущено...

Два дня думаю над сохранением состояния. В случае если юзер нажал Ctrl+C или тикнул таймер (раз
в минуту) приложение должно писать состояние своей FSM в какой-нить файл типа
/var/run/pwdgen.fsm.


речь идёт о том что варианты будут генерироваться не все сразу, а за несколько запусков ?
Речь в том что это не просто утилита. А это скорее всего процесс. Который будет
работать долго. Не один день. И не неделю. Вот я и думаю наперёд о сохранении
расчётов.

Такой уж у меня пунктик. Думаю наперёд.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809662
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymayton, изучил немного ваш код. А где перебор то ?) или пока ещё нет
Там всё уже есть. Это рабочий код.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809687
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значить любилям гонять бенчмарки и прочим кто в танке.

Первое. Не запускать вывод на экран. Он физически тормозит.

Второе . Запускать с выводом в файл или с выводом в пустое устройство NULL.
Счастливые обладатели Толтого Тукса или Чёрта в кедах юзают /dev/null.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38809702
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если задача сводится к тому что надо гонять генератор по кругу и иногда получать от него текущее состояние, то можно так
Код: plaintext
1.
2.
3.
4.
int64 i = START_VALUE;
while(true) {
  i++;
}



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

Как вариант: можно снимать текущее значение другим потоком. Можно несколько потоков запустить, а результат склеивать.

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

PS Только паузу надо добавить чтоб проц не спалить такой считалкой
...
Рейтинг: 0 / 0
Тяпничный 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
Тяпничный pwdgen
    #38810025
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВопрос возникает: сгенерил ты последовательность из триллиона триллионов паролей, но они последовательно идут, т.е. узнал сегодняшний - быстро подобрал вчерашний. Надо перемешивать или выбирать случайный, т.е. надо хранить все и удалять использованные.
Стандартный когруэнтный генератор rand() который мы используем повсеместно
практически обеспечивает то что мне надо. Компактный. Его состояние - это
суть целое число. Для инстанциирования достаточно сделать ему seed(..), или srand(..)
и он побежит от этого числа дальше по кругу.

Единственное требование - неповторяемость значений в него не заложены.
Что-ж. Можно создать свой собственный. Например взяв обычный счётчик
и поменяв местами в нём все биты. Получим циклическую уникальную
последовательность? Ответ - да. Получим.

Вопрос насколько она будет хороша с точки зрения случайности - пока
открыт. Я не знаю. Но возможно для данной задачи и сойдет.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810038
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Устал постить простыни. Вот сорц .
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810051
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TВопрос возникает: сгенерил ты последовательность из триллиона триллионов паролей, но они последовательно идут, т.е. узнал сегодняшний - быстро подобрал вчерашний. Надо перемешивать или выбирать случайный, т.е. надо хранить все и удалять использованные.
Стандартный когруэнтный генератор rand() который мы используем повсеместно
практически обеспечивает то что мне надо. Компактный. Его состояние - это
суть целое число. Для инстанциирования достаточно сделать ему seed(..), или srand(..)
и он побежит от этого числа дальше по кругу.
т.е. сгенерить, сохранить, а потом выбирать рандомно. Отлично, но от "сохранить" не избавились.

maytonЕдинственное требование - неповторяемость значений в него не заложены.
Что-ж. Можно создать свой собственный. Например взяв обычный счётчик
и поменяв местами в нём все биты. Получим циклическую уникальную
последовательность? Ответ - да. Получим.

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

А как такую мысль оценишь: метод от обратного, раз уж ты хранишь использованные пароли, то может просто генерить рандомно, а потом проверять что пароль раньше не использовался?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСовсем нехорошо, взлом немного усложняет, надо дополнительно разгадать алгоритм перестановки. Это несложно если есть десяток последовательно сгенеренных паролей.
На счет десятка погорячился, посложнее, сходу не придумаю как, но интуиция подсказывает что кому надо этот ребус разгадает.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810065
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСовсем нехорошо, взлом немного усложняет, надо дополнительно разгадать алгоритм перестановки. Это несложно если есть десяток последовательно сгенеренных паролей.

А как такую мысль оценишь: метод от обратного, раз уж ты хранишь использованные пароли, то может просто генерить рандомно, а потом проверять что пароль раньше не использовался?
На самом деле и не усложняет и не упрощает. Просто если перебирать их
последовательно то велика вероятность что первые фазы работы
переборщика будут холостые. Ну просто нет паролей из нулей 0000000
или букв aaaaaa. Тут есть еще другая тема. Если есть возможность
подбирать "близость" пароля то уж точно надо бить его рандомно.
Как в генентических алгоритмах. Кидать случайно хромосомы
и смотреть какая лучше пригодилась. Впрочем это фантазии.

По поводу хранения.

Да нет. Не храню я их нигде. Они уходят в другую тулзу. Которая их проверяет на пригодность.
Как - это уже другой вопрос в другой топик. И та тулза тоже не хранит. Не ее это функции.

По сути как я себе представлял хранение. Запускаем параллельный Thread/Process который хотя-бы раз
в минуту сбрасывает *buf в файлик /var/pwdgen/state. И всё чики-пики.

Случайный пьяный электрик мне не страшен.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810248
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, я понял ваш код.

каждый раз после формирования новой комбинации, происходит проверка
Код: plaintext
1.
while (num_size <= max_len) 

. Учитывая то, сколько этих комбинаций планируется, мне показалось это слишком затратно.

В этом участке кода

Код: plaintext
1.
2.
		for (size_t i = num_size; i != 0; --i) {
			size_t d = i - 1;



в дальнейшем, вы ни разу не используете i, потому лучше заменить этот участок на следующий(мне так показалось, вам виднее)
Код: plaintext
1.
		for (size_t d = num_size-1; d>= 0; --d) {



У вас произойдёт 1 лишний realloc.


несмотря на всё это, ваш алгоритм имеет более общий характер чем мой. Единственно что не понял, эти строчки. Зачем они ?

Код: plaintext
1.
2.
		if ((progress & 0xFFFFFF) == 0)
			fprintf(stderr, "%lu\n", progress);
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810249
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryЕсли адрес не принадлежит тем адресам, по которым выделена память, то мы получаем undefined behaviour, потому, если мы получаем истинный результат, не факт что он действительно истинный. Хотя если получаем ложный, то наверняка знаем что он ложный. Интересное свойствоUB будет, если _читать_ данные из указателя, который не принадлежит к выделенному куску памяти. Для сравнения чтение не требуется. И, конечно, если мы получили истинный результат, то это факт, что он действительно истинный, из этого адреса можно читать без всяких там UB. Иначе программирование в принципе не возможно.


простите, но это не так

Anatoly Moskovsky Dima T, SashaMercury

Согласно стандарту, указатель может указывать либо в аллоцированный объект, либо сразу за (в следующий за объектом байт).
(Если платформа не позволяет хранить указатели за пределы выделенной памяти, то имплементация должна выделять на 1 байт больше)

Все операции, в результате которых получаются указатели за пределами какого либо выделенного объекта (перед либо более 1 байта после) - это UB. Как и сравнение <, > с такими указателями
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810253
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryВремя, требуемое на выполнение можно рассчитать, и вывести общую формулу.Мне кажется что потребуется минимум несколько лет, или столетий в крайних случаях. С кодом тоже завтра буду разбираться..засыпаю.
pwd из 20 символов - это маргинальный пример которого я надеюсь никогда
не будет.

P.S. Что у тебя за часовой пояс?
Если 20 не будет никогда, то значит будет 19.
Если x количество вариантов на одну позицию, то мы получаем вариантов. Пусть 1 символ занимает y Байт, тогда мы имеем Байт информации.

Пусть, x=26,y=1, тогда имеем Байт=Байт >4ЙБ. Поправьте, если я где-то ошибся.

PS
GMT+10
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810276
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonпропущено...

pwd из 20 символов - это маргинальный пример которого я надеюсь никогда
не будет.

P.S. Что у тебя за часовой пояс?
Если 20 не будет никогда, то значит будет 19.
Если x количество вариантов на одну позицию, то мы получаем вариантов. Пусть 1 символ занимает y Байт, тогда мы имеем Байт информации.

Пусть, x=26,y=1, тогда имеем Байт=Байт >4ЙБ. Поправьте, если я где-то ошибся.

PS
GMT+10

немного ошибся. При максимальное длине строки в 19 символов, x-количество вариантов, y-количество Байт одного символа, получаем поток в
Пересчитаю для случаев, когда пароль равен 12 символам, и x=26,y=1 тогда имеем поток в . Это чуть менее 1 Эиб, или около ТБ.

Сколько времени будет формироваться такой поток?(не говорю о том что его нужно хранить)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810278
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посчитал, если за 1 секунду будет обрабатываться 1 Гб информации, то для случая из 12 символов, и 26 вариантов для каждого символа, мы получим 34 года
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕдинственное требование - неповторяемость значений в него не заложены.
Что-ж. Можно создать свой собственный. Например взяв обычный счётчик
и поменяв местами в нём все биты. Получим циклическую уникальную
последовательность? Ответ - да. Получим.

Вопрос насколько она будет хороша с точки зрения случайности - пока
открыт. Я не знаю. Но возможно для данной задачи и сойдет.
С точки зрения случайности не очень, т.к. половина соседних значений будут отличаться одним битом, четверть двумя и т.д.
Вот если придумать такую функцию которая изменит хотя бы треть битов у соседних значений, тогда со случайностью будет получше.
Но и это не панацея, т.к. достаточно расковырять твой EXE, понять алгоритм и готово.

ИМХУ для паролей все-таки лучше ГСЧ и пусть повторы будут.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСколько времени будет формироваться такой поток?(не говорю о том что его нужно хранить)
Вот блин опять двадцать пять. Мои ответы никто не читает. Никто этот поток не хранит! И не будет хранить.
И 19 символов - это крайность. Общий случай с паролем из префикса и двух цифр я описал выше.

Ох уж эти часовые пояса.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810384
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, всё читаю )

так и не говорю, что они должны храниться, очевидно не должны, а говорю только про то время, что они будут формироваться. Если за секунду вы будете обрабатывать 1 Гб информации, то на все возможные варианты из 12 символов (26 вариантов на каждый), уйдёт 34 года ).
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810385
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпростите, но это не так
Anatoly Moskovsky Как и сравнение <, > с такими указателямив нашем случае сравнение обратное. Тестируемый указатель сравнивается с заведомо правильными, поэтому никакого UB. Если он лежит в допустимых пределах, то из него можно читать, если нет - то нельзя. И в чём же заключается твоё "не так"?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810386
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryкаждый раз после формирования новой комбинации, происходит проверка
Код: plaintext
1.
while (num_size <= max_len) 


. Учитывая то, сколько этих комбинаций планируется, мне показалось это слишком затратно.
Да, можно легко убрать это сравнение, если вычислять пароли отдельно для каждой длины .
Но мне было лень :)
SashaMercuryВ этом участке кода

Код: plaintext
1.
2.
		for (size_t i = num_size; i != 0; --i) {
			size_t d = i - 1;


в дальнейшем, вы ни разу не используете i, потому лучше заменить этот участок на следующий(мне так показалось, вам виднее)
Код: plaintext
1.
		for (size_t d = num_size-1; d>= 0; --d) {


Второй вариант некорректный, т.к. size_t беззнаковый и условие выхода никогда не выполнится.
Правильно так:
Код: plaintext
1.
for (size_t d = num_size-1; d != ~0u; --d)

или так
Код: plaintext
1.
for (size_t d = num_size-1; d < num_size; --d)


Но оба эти варианта для меня не сильно читаемы.

Я лично не вижу никаких проблем с тем что i используется только для условия цикла.
Такой вариант как у меня мне больше нравится с точки зрения читаемости.
А с точки зрения дублирования кода - компилятор такие конструкции вполне успешно оптимизирует.
После оптимизации получится что-то типа:
Код: plaintext
1.
2.
3.
4.
for(size_t d = num_size; d;) {
  --d;
  // тело цикла
}


Я иногда и сам так пишу обратный цикл :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810400
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
скажите пожалуйста, какая предполагается реальная максимальная длина строки, и количество вариантов на каждую позицию ?
Сколько времени максимум вы предполагаете на полный перебор всех вариантов при заданных ограничениях?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810413
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСколько времени максимум вы предполагаете на полный перебор
Копать от меня и до обеда :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810445
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonm_Sla, ОК. Пожалуй сделаю бранч утилиты. Будет два направления. Рекурсивное и Tricky-численное.на с++ накидал черновой вариант
умеет работать в несколько потоков, пишет сразу в файлы:
Код: 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.
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.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
//
//  tricky_number.h
//

#ifndef TRICKY_NUMBER_H
#define TRICKY_NUMBER_H

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <stdlib.h>
#include <cstring>


using namespace std;

//===============================
//
class alphabet
{
    public:
        vector<string> alphabet;
};
//===============================
//
class digit
{
    public:
        size_t value;
        alphabet alphabet_digit;
        digit(size_t ini) { value = ini; }
};
//===============================

class tricky_number
{
    public:
        vector<digit> num;
        string output_file_name;
        unsigned __int64 i;
        unsigned __int64 max_i;
        size_t current_thread;
        size_t max_thread;
        size_t work;

        tricky_number();
        virtual ~tricky_number();

        void ini_alphabet(size_t par_max);
        void ini(size_t min, size_t max, size_t current_thread, size_t max_thread, string output_file_name);
        void run();


    protected:
        void out_num(ofstream *file);
        void print_num();
        void add_num();
        void dec_to_tricky_number(unsigned __int64 dec);
        unsigned __int64 pow(unsigned __int64 base, size_t exponent);

    private:

};

#endif // TRICKY_NUMBER_H

//
//  main.cpp
//

#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
#include <process.h>

#include "tricky_number.h"

using namespace std;

vector<string> sym_set;

string alpha        = "abcdefghijklmnopqrstuvwxyz";
string upper        = "ABCDEFGHIJLKMNOPQRSTUVWXWY";
string xdigits      = "0123456789ABCDEF";
string digits       = "0123456789";
string punct        = "!@#$%^&*()-=_+,./?~`\\|";

vector<tricky_number> nums;

tricky_number *threads[256]; // максимум 256 потоков

size_t min_len = 6;
size_t max_len = 6;

//////////////////////////////////////////
void string_to_vector(vector<string> *vec, const string &str)
{
    for(size_t i=0; i < str.size(); i++)
    {
        vec->push_back(string(1,str[i]));
    }
}
//////////////////////////////////////////
// запуск потока
void Run(void * i)
{
    threads[(int)i]->run();
}
//////////////////////////////////////////
int main(int argc,char **arg, char **env)
{
    // работаем в 3 потока
    nums.resize(3);

    // определяем алфавит для каждого разряда
    for(size_t i=0; i < nums.size(); i++)
        nums[i].ini_alphabet(max_len);

    sym_set.clear();
    string_to_vector(&sym_set, alpha);
    for(size_t k=0; k < nums.size(); k++)
        for(size_t i = 0, max_i = nums[k].num.size(); i < max_i; i++)
            nums[k].num[i].alphabet_digit.alphabet = sym_set;

    // определяем параметры
    for(size_t i=0; i < nums.size(); i++)
        nums[i].ini(min_len, max_len, i+1, nums.size(), "out_");

    // запускаем потоки
    for(size_t i=0; i < nums.size(); i++)
    {
        threads[i] = &nums[i];
        _beginthread( Run, 10000, (void *) i );

    }

    // ждем завершения потоков
    size_t work;
    do
    {
        Sleep(100);
        work = 0;
        for(size_t i=0; i < nums.size(); i++)
            work += nums[i].work;

    }while(work);

    return 0;
}
//////////////////////////////////////////


//
//  tricky_number.cpp
//

#include "tricky_number.h"

//////////////////////////////////////////
tricky_number::tricky_number()
{
    //
}
//////////////////////////////////////////
tricky_number::~tricky_number()
{
    //
}
//////////////////////////////////////////
// увеличиваем "хитрое" число на 1
void tricky_number::add_num()
{
    size_t i = 0;
    bool carry = false;

    do{
        num[i].value++;
        if(num[i].value > num[i].alphabet_digit.alphabet.size())
        {
            num[i].value = 1;
            carry = true;
        }
        else
        {
            carry = false;
        }

        i++;
    }while(carry);
}
//////////////////////////////////////////
void tricky_number::print_num()
{
    char str[256];
    str[0]=0;

    size_t i = 0;
    while(num[i].value && num.size() > i)
    {
        strcat(str, num[i].alphabet_digit.alphabet[num[i].value - 1].c_str());
        i++;
    }

    strcat(str,"\r\n");

    cout << str << endl;

}
//////////////////////////////////////////
// вывод в файл
void tricky_number::out_num(ofstream *file)
{
    string str;

    size_t i = 0;
    while(num[i].value)
    {
        str += num[i].alphabet_digit.alphabet[num[i].value - 1];
        i++;
    }

    str+="\r\n";

    file->write(str.c_str(),str.size());
}
//////////////////////////////////////////
void tricky_number::ini_alphabet(size_t par_max)
{
    num.resize( par_max + 1, 0);
}
//////////////////////////////////////////
unsigned __int64 tricky_number::pow(unsigned __int64 base, size_t exponent)
{
    __int64 rez = 1;

    for(size_t i = 0; i < exponent; i++)
        rez*=base;

    return rez;
}
//////////////////////////////////////////
void tricky_number::ini(size_t par_min, size_t par_max, size_t par_current_thread, size_t par_max_thread, string par_output_file_name)
{
    work = 0;

    char number[256];
    itoa(par_current_thread, number, 10);

    output_file_name = par_output_file_name + number + ".lst";
    current_thread = par_current_thread;
    max_thread = par_max_thread;

    // выводим чило в цикле
    // while(i < max_i) ВыводЧисла();
    // рассчитываем i и max_i  в зависимости от par_min, par_max
    i = 0;
    for(int k=0; k < par_min-1; k++)
        i += pow(num[k].alphabet_digit.alphabet.size(), k+1);

    max_i = 0;
    for(size_t i=0; i < par_max; i++)
        max_i += pow(num[i].alphabet_digit.alphabet.size(), i+1);

    //cout << "min = " << i << endl;
    //cout << "max = " << max_i << endl;

    // Корректируем i и max_i в зависимости от текущего потока
    unsigned __int64 delta = (max_i - i) / max_thread + 1;
    unsigned __int64 add = i;
    if( ((current_thread - 1)*delta + add) > max_i)
        i = max_i;
    else
        i = (current_thread - 1)*delta + add;

    if( ((current_thread - 1)*delta + delta + add + 1) < max_i )
        max_i = (current_thread - 1)*delta + delta + add + 1;

    //cout << "min = " << i << endl;
    //cout << "max = " << max_i << endl;

    dec_to_tricky_number(i + 1); //устанавливаем "хитрое" число
    //print_num();
    cout << endl;
}
//////////////////////////////////////////
void tricky_number::run()
{
    work = 1;

    ofstream outfile(output_file_name.c_str(), std::ofstream::binary);
    cout << "Start: " << output_file_name << endl;

    while(i < max_i)
    {
        out_num(&outfile);
        add_num();

        i++;
    }

    cout << "End: " << output_file_name << endl;
    //print_num();

    outfile.close();
    work = 0;
}
//////////////////////////////////////////
void tricky_number::dec_to_tricky_number(unsigned __int64 dec)
{
    size_t k=0;

    do
    {
        num[k].value = (dec % num[k].alphabet_digit.alphabet.size());
        dec /= num[k].alphabet_digit.alphabet.size();
        k++;

    }while(dec);
}
//////////////////////////////////////////

при работе в 2 потока примерно в 2 раза медленнее твоего варианта (надо оптимизировать)
вечером попробую дома на 8 потоках запустить
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymayton,
скажите пожалуйста, какая предполагается реальная максимальная длина строки, и количество вариантов на каждую позицию ?
Сколько времени максимум вы предполагаете на полный перебор всех вариантов при заданных ограничениях?
Я предлагаю сейчас не обсуждать этот вопрос. Пятничный хакатон который я предложил
вобщем-то не имел такого глубокого исследовательского смысла.

Любой из вас знает какой длины пароли требуются для соц-сетей и корпоративных доменов.
Тут речи нет. И любой из вас знает как вы сами генерируете пароли когда нет ограничений.
И какие пароли вы придумываете для .zip архивов.

Я предложил тему и дал ей возможность развиваться. Про 19 и 20 символов и про хранение
гигабайтов вы уже додумали сами.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810563
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaпри работе в 2 потока примерно в 2 раза медленнее твоего варианта (надо оптимизировать)
вечером попробую дома на 8 потоках запустить
Запускай из консоли с опциями

Код: plaintext
1.
2.
> start /AFFINITY 0x01 pwdgen ...
> start /AFFINITY 0x02 pwdgen ...



Данная задача удобна тем что в ней почти нет синхронизации. Есть порции задач которые
можно делать независимо. Идеальный хадуп.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810656
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810818
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercurymayton,
скажите пожалуйста, какая предполагается реальная максимальная длина строки, и количество вариантов на каждую позицию ?
Сколько времени максимум вы предполагаете на полный перебор всех вариантов при заданных ограничениях?
Я предлагаю сейчас не обсуждать этот вопрос. Пятничный хакатон который я предложил
вобщем-то не имел такого глубокого исследовательского смысла.

Любой из вас знает какой длины пароли требуются для соц-сетей и корпоративных доменов.
Тут речи нет. И любой из вас знает как вы сами генерируете пароли когда нет ограничений.
И какие пароли вы придумываете для .zip архивов.

Я предложил тему и дал ей возможность развиваться. Про 19 и 20 символов и про хранение
гигабайтов вы уже додумали сами.

меня нет в соцсетях нет, потому не знаю. А в организациях известно какие пароли Зима@2014, Лето@2014 и т.д.

Вот для zip пожалуй пойдет. Я недавно книжку скачал, но чтобы её распаковать нужен пароль.
Тема хорошая, не спорю :))
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810822
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот видишь. Зима... Летто.. @ и четыре цифирки.

Я знавал одного админа который IP в пароль трансформировал. Хитрец блин... Но я-то об этом тоже знал
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810833
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

может быть это стандартная конструкция, дублирования переменной типа size_t в цикле, но человеку приходится тратить больше времени чтобы понять зачем эта новая переменная. Потому и спросил. Буду знать, если ещё раз встречу цикл по size_t переменной
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810845
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryпростите, но это не так
пропущено...
в нашем случае сравнение обратное. Тестируемый указатель сравнивается с заведомо правильными, поэтому никакого UB. Если он лежит в допустимых пределах, то из него можно читать, если нет - то нельзя. И в чём же заключается твоё "не так"?

Нельзя сравнивать один некорректный адрес памяти и один корректный..Позже я составлю отдельный топик..
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811012
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНельзя сравнивать один некорректный адрес памяти и один корректный.круто ))) пока мы не сравнили, мы не знаем, корректный ли у нас адрес.
SashaMercury.Позже я составлю отдельный топик.ок, здесь это явный офф-топ
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811091
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как говорил Кристофер Уокен - Оки доки артишоки.

Подкину инфы на вентиллятор. Допустим у нас есть файлик
зашифрованный DES-ом. Для тех кто в танке. Это метод
при котором файл (условно) бъётся а блоки по 64бит.
И к каждому блоку применяется некая формула преобразования
после которой мы получаем новый уникальный блок. Совершенно
не похожий на исходный. Аргументами в этом отображении являются
ключ(Key) и вектор инициализации (IV). Это такие себе два байтовых
массивчика.

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

IV - вшивается в софт (обычно). А Key формируется на базе
парольной фразы. Есть более сложные схемы формирования
Key с использованием внешнего источника энтропии (часы),
координаты мышки на экране e.t.c. Есть попытки усложнения
парольной фразы путём подмешивания к ней Salt. Это для
устранения тривиальных pwd. Salt как и IV обычно вшивается
в софт.

Чаще всего ключ генерируется на основе парольной фразы.
key=F(pwd + 'Salt...');
Это 90% случаев.

Далее вопрос. Если мы знаем ПО которое выполнило des-преобразование
и знаем IV, Salt, и функцию F которая обеспечила генерацию key,
И знаем априорно что пользователь использовал короткий pwd.
порядка 3-4 символа и знаем также априорно что пользователь шифровал набор
стандартных часто-употребимых файлов (jpg, pdf, doc, xml).

Можем-ли мы восстановить оригинальный key?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811106
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однократный DES, вроде, без проблем ломается полным перебором.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811115
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый главный вопрос остался за кадром. В какой момент вы остановите перебор?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811121
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу вернуть вопрос: в какой момент поймёте, что пароль правильный?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811122
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка. Мы ищем ключ а не пароль.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811132
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. перебрать ~40^4 вариантов дольше, чем искать ~56 битный ключ???
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811137
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovТ.е. перебрать ~40^4 вариантов дольше, чем искать ~56 битный ключ???
Ты пока не ответил на мой самый каверзный вопрос.
Как ты себе представляешь алгоритм т.н. "перебора" ?
Что у тебя будет являться критерием останова?

В скобках замечу что дешифрование блока никогда не выдаёт
ошибки. Оно всегда говорит - ОК!
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811165
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В условиях вброса предполагается, что в расшифрованном тексте есть общеизвестные куски. "По моему так".
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811223
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теплее вобщем. Метод открытого текста называется.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811231
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Давайте в топике оперировать фразами "алгоритм", "сопоставление".
"вектор ключа", "вектор инициализации".

Прошу не использовать некоторые слова и термины которые могут быть
истолкованы ... ну кхм... слишком уж радикально и против правил.

Мы - бескорыстно. С позиции обучения инфо-безопасности изучаем
разные вопросы.

Вот как то в таком аспекте.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811239
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТы серьезно или троллишь?Абсолютно.
Вне зависимости от того, что ищется, тестирование результата расшифровки требует каких-то априорных знаний о зашифрованном тексте.
Если, дополнительно, указывается, что пароль заведомо слабый, то идея перебирать относительно длинный (двоичный) ключ вместо короткого (текстового) пароля - странная, мягко говоря.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811248
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПоправка. Мы ищем ключ а не пароль.
Стоп-стоп. Дима. Василий.

Я понял. Вы неправильно истолковали мою фразу. Мы действительно ищем ключ.
Но алгоритм генерации ключа на основе pwd фразы - проприетарен.

Как генерит его WinRar или WinZip - я не знаю. Но почти 100% они генерят
ключи по своему.

Конечно никто не будет перебирать DES ключи.

Я ставлю акценты на следующем.

1) Мощность множества ключей которые используют люди в рамках
конкретного проприетарного ПО во много крат меньше паспортной
номинальной мощности крипто-алгоритма.

2) Любой анализ на сопоставление ключей возможен только
в том случае когда мы имеем КРИТЕРИЙ успеха. Если мы ищем
ключ для файла содержащего белый шум - то наша затея
обречена на провал. Невозможно написать правильный тест
на успех. Поэтому мы будем рассматривать только
http://www.garykessler.net/library/file_sigs.html
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811250
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима. ОК! Удалил.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811257
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё, я понял, свою (логическую) ошибку
Тогда, если есть достаточно (дискового) пространства и (исходный) блок, содержимое которого полностью известно, будет классическая атака по словарю :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811342
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже что можем. Но нам нужно наверняка знать, какой набор байт будет содержаться в дешифрованном сообщении. Дешифровали, проверили содержатся ли определенная информация в памяти, и т.д., когда она будет содержаться, цикл можно остановить
Для данного конкретного кейса - DES (одинарный) можно декодировать первые 64 бита
из трафика и уже на основании их принять решение - есть-ли стандартная сигнатура
или нет.

Это справедливо для PNG, RAR 5.0 первые 8 байт жёстко заданы стандартом. Это
удачное стечение обстоятельств. Но вот что делать с JPEG, PDF, GIF ? Не знаю.

Вот в этом направлении я сейчас думаю.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811355
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще если криптоалгоритм сильный, то открытый текст не нужен для проверки ключа.
По идее можно считать энтропию декодированного блока (или нескольких блоков).
Правильный ключ должен давать существенно более низкую энтропию.
Но это так, моя гипотеза. Я не в курсе насколько это применимо на практике.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811388
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, переписал на С, выкинул всё лишнее.
Перебирает диапазон n-m, остальные опции аналогичны твоему варианту.
Код: 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.
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.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *partLower    = "abcdefghijklmnopqrstuvwxyz";
char *partDigit    = "0123456789";
char *partHex      = "ABCDEF";
char *partUpper    = "GHIJLKMNOPQRSTUVWXWY";
char *partPunct    = "!@#$%^&()-=+.,~`;/\\?*:|\"<>_";

char alphabet[256];

size_t num[256];
size_t scale_of_notation[256];
char *alphabet_num[256];
size_t len;

/////////////////////////////////////
void run(size_t min, size_t max, char *alphabet)
{
    // инициализация
    len = min;
    for(size_t i=0; i < min; i++)
        num[i] = 1;

    for(size_t i=0; i <= max; i++)
    {
        alphabet_num[i]=alphabet;
        scale_of_notation[i]=strlen(alphabet);
    }

    while(len <= max)
    {
        //вывод num
        char str[256];
        str[0]=0;
        size_t i = 0;
        while(num[i])
        {
            //strcat(cstr,alphabet[i][num[i] - 1]);
            str[i]=alphabet[num[i] - 1];
            i++;
        }
        str[i]=0;
        puts(str);

        // увеличиваем num на 1
        i = 0;
        size_t carry = 0;
        do
        {
            num[i]++;
            if(num[i] > scale_of_notation[i])
            {
                num[i] = 1;
                carry = 1;
            }
            else
            {
                carry = 0;
            }

            i++;
        }
        while(carry);
        if(i > len) len=i;
    }
}
/////////////////////////////////////

struct option
{
    char *opt;
    size_t code;
};

struct option options[] = {
    {"lower",1},
    {"punct",2},
    {"upper",3},
    {"xdigit",4},
    {"digit",5},
    {"\0x00",0}
};

/////////////////////////////////////
size_t find_option(char *option)
{
    size_t result = 0;

    for(size_t i=0; *options[i].opt; i++)
        if (strcmp( option, options[i].opt) == 0)
        {
            result = options[i].code;
            options[i].code = 0;
            break;
        }

    return result;
}
/////////////////////////////////////
int main(int argc,char **arg, char **env)
{
    if (argc < 3)
    {
        fprintf(stderr,"\nPassword Generation 2.0 (c) m_Sla and SQL.RU. Written in 'C' :)\n");
        fprintf(stderr,"Special thnx to: Mayton, Dima T.\n");
        fprintf(stderr,"\nUsage: pwdgen [n] [m] [options..] \n");
        fprintf(stderr,"\nWhere: options:\n");
        fprintf(stderr,"\n       lower  - Lowercase alphabetic characters [a..z]");
        fprintf(stderr,"\n       punct  - Punctuation characters [,!?..]");
        fprintf(stderr,"\n       upper  - Uppercase alphabetic characters [A..Z]");
        fprintf(stderr,"\n       xdigit - Hexidecimal characters");
        fprintf(stderr,"\n       digit  - Numeric digits [0..9]");
        fprintf(stderr,"\n");
        return -1;
    }
    else
    {
        int n = 0;
        n = atoi(arg[1]);
        int m = 0;
        m = atoi(arg[2]);
        if(m < n)
        {
            fprintf(stderr,"\n[m] cannot be less than [n]!\n");
            return -3;
        }
        if (m > 0 && n > 0)
        {
            if (argc==3)
            {
                strcat(alphabet, partLower);
                run( n, m, alphabet);
                return 0;
            }
            else
            {
                size_t i = 3;
                while(i<argc)
                {
                    switch(find_option(arg[i]))
                    {
                    case 1: // lower
                        strcat(alphabet,partLower);
                        break;
                    case 2: // punct
                        strcat(alphabet,partPunct);
                        break;
                    case 3: // upper
                        strcat(alphabet,partHex);
                        strcat(alphabet,partUpper);
                        break;
                    case 4: // xdigit
                        strcat(alphabet,partDigit);
                        strcat(alphabet,partHex);
                        break;
                    case 5: // digit
                        strcat(alphabet,partDigit);
                        break;
                    }
                    i++;
                }
                if(strlen(alphabet))
                    run( n, m, alphabet);
            }
        }
        else
        {
            fprintf(stderr,"\nArgument cannot be less than 0 or not a number!\n");
            return -2;
        }
    }
    return 0;
}
/////////////////////////////////////

...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811391
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорости твоего и моего варианта примерно равны.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811658
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНо это так, моя гипотеза. Я не в курсе насколько это применимо на практике.Если криптографическое ПО - сильное, то перед шифрованием оно упаковывает данные и убирает заголовки, если таковые имеются.
Именно для того, чтобы затруднить статистический анализ.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811757
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla, svn-ом умеешь пользоваться? Давай добавлю тебя в разработчики.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811764
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaСкорости твоего и моего варианта примерно равны.
О. Круть. На выходных подниму нормальный Linux с человеческим лицом
и погоняю бенчмарки. Правда железяка старая. Celeron 32bit.
Вчера пропатчил на ноуте Windows MinGW до 4.10.0 дак он теперь язык "C"
не понимает. Каких то либ не хватает.

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

P.S. Просто чтобы не уходить в дебри...
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811804
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь - возможно баг. Или поведение отличается от моего сорца.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 case 4: // xdigit
                        strcat(alphabet,partDigit);
                        strcat(alphabet,partHex);
                        break;
                    case 5: // digit
                        strcat(alphabet,partDigit);
                        break;
                    }



В идеале я могу указывать набор чар-сетов.

Например:

Код: plaintext
1.
pwdgen 1-3 digit xdigit



Но здесь мы возможно получим дублирование символов 0..9 и как следствие - лишние холостые
обороты алгоритма.

Just IMHO.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811868
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа. Такой факт возможен. Но я такого ПО не знаю.PGP, вообще-то.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811869
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, да, поведение отличается. Не уверен, что нужно исправлять.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811896
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonm_Sla, svn-ом умеешь пользоваться? Давай добавлю тебя в разработчики.Не надо. Пишу пока интересно и пока время есть.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811915
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... старина Циммерман слил его исходнички в своей книге. Так ште...
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811918
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slamayton, да, поведение отличается. Не уверен, что нужно исправлять.
Можно и оставить так. Только в help поставить варнинг об этой фиче.

А что с сериализацией? Получилось делать --continue?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811929
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...
А что с сериализацией? Получилось делать --continue?По какому условию сохранять текущее состояние?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38811936
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу... старина Циммерман слил его исходнички в своей книге. Так ште...Речь не об открытии исходников, а о предварительной упаковке шифруемого материала.
Вы сказали, что не знаете софта, который это делает, я указал на общеизвестный пример.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812040
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,

у вас проверяется длина текста каждый раз после вывода сообщения, я правильно понял ?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812042
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень похоже на алгоритм Анатолия, и мы с ним уже обсуждали этот момент. Если мой вывод выше правильный
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812143
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryОчень похоже на алгоритм Анатолия, и мы с ним уже обсуждали этот момент. Если мой вывод выше правильныйАга алгоритм одинаковый. Разница в реализации. У меня вывод наоборот.
Перевод числа в строку у Анатолия по другому сделан. Надо подумать и у себя так сделать. Хотя для "алфавита" переменной ширины (постановка по словарю), не так просто будет.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812290
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slamayton...
А что с сериализацией? Получилось делать --continue?По какому условию сохранять текущее состояние?
Ну.... по сигналу SIGINT например.

https://ru.wikipedia.org/wiki/SIGINT

Как это сейчас реализовать на сях я еще нечитал... но в бытность на Борландах вроде делал.
Так что 99% должно срабоать.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812297
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот до кучи. Экземпл.
http://www.thegeekstuff.com/2012/03/catch-signals-sample-c-code/

P.S. Чортов интерфейс IDE. Не могу найти DVD-привод. Без этого Пингвин Тухс мне не брат.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812304
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Revision: 6
Author: mayton
Date: Thursday, November 20, 2014 5:01:29 PM
Message:
m_Sla: Ported into "C"
----
Modified : /branches/m_Sla/main.cpp

...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812384
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskynik_x,

Тут немного другое требуется.
Вместо того чтобы сгенерировать ровно один случайный пароль, как делает эта программа (и однострочник в первом ответе), надо сгенерировать ВСЕ пароли из заданного множества.
Собирать пробовали?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812387
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nik_x, чё такое pwxgen?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812391
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnik_x, чё такое pwxgen?
Чё такое "Тяпничный pwdgen"?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812396
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто ты заскриншотил неизвестный софт. Вот я и спрашиваю. Что это?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812410
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пофиксил С++ - compatibility. Терь собирается плюсами. Добавил константный префикс.

Теперь можно так.

Код: plaintext
1.
$ pwdgen 4 digit prefix=Зима 
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812464
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nik_xСобирать пробовали?
Боже упаси :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812663
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил параметры запуска prefix=, suffix=, save=, continue=.

pwdgen 1 6 - Состояние сохраняется в файл pwdgen.sav
pwdgen 1 6 save=123.sav - Состояние сохраняется в файл 123.sav
pwdgen continue - Считываем состояние из pwdgen.sav и продолжаем работу
pwdgen continue=123.sav - Считываем состояние из 123.sav и продолжаем работу
Код: 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.
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.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

char *partLower    = "abcdefghijklmnopqrstuvwxyz";
char *partDigit    = "0123456789";
char *partHex      = "ABCDEF";
char *partUpper    = "GHIJLKMNOPQRSTUVWXWY";
char *partPunct    = "!@#$%^&()-=+.,~`;/\\?*:|\"<>_";

char alphabet[256];

size_t num[256];
size_t scale_of_notation[256];
char *alphabet_num[256];
size_t len;
size_t min;
size_t max;
char file_name_to_save[256];
char prefix[256];
char suffix[256];


size_t stop = 0;

/////////////////////////////////////
void sig_handler(int signo)
{
    if (signo == SIGINT)
    {
        fprintf(stderr,"received signal\n");
        stop = 1;
    }
}
/////////////////////////////////////
void load()
{
    FILE * pFile = fopen (file_name_to_save,"r+");

    if (pFile!=NULL)
    {
        fscanf(pFile, "%d,%d,%d\r", &min, &max, &len);
        fscanf(pFile, "%s\r%s\r%s\r", file_name_to_save, prefix, suffix);
        if( strcmp( prefix, "(null)") == 0) prefix[0]=0;
        if( strcmp( suffix, "(null)") == 0) suffix[0]=0;

        for(size_t i=0; i<max+1; i++)
            fscanf(pFile, "%d,%d,", &num[i], &scale_of_notation[i]);
        fscanf(pFile, "\r");

        for(size_t i=0; i<max+1; i++)
        {
            alphabet_num[i] = calloc(256, 1);
            for(size_t k=0; k<scale_of_notation[i]; k++)
                fscanf(pFile, "%c\r", &alphabet_num[i][k]);
            fscanf(pFile, "\r");
        }

        char str[256]; str[0]=0;
        fscanf (pFile, "\r%s\r", &str[0]);
        if(strcmp( str, "m_Sla") != 0)
        {
            fprintf(stderr,"\nBad file.\n");
            exit(-10);
        }

        fclose (pFile);
    }
    else
    {
        fprintf(stderr,"\nCan't open file.\n");
    }
}
/////////////////////////////////////
void save()
{
    FILE * pFile = fopen (file_name_to_save,"w+");

    if (pFile!=NULL)
    {
        fprintf (pFile, "%d,%d,%d\r", min, max, len);
        if(!prefix[0])strcpy(prefix,"(null)");
        if(!suffix[0])strcpy(suffix,"(null)");
        fprintf (pFile, "%s\r%s\r%s\r", file_name_to_save, prefix, suffix);

        for(size_t i=0; i<max+1; i++)
            fprintf (pFile, "%d,%d,", num[i],scale_of_notation[i]);
        fprintf(pFile, "\r");

        for(size_t i=0; i<max+1; i++)
        {
            for(size_t k=0; k<scale_of_notation[i]; k++)
                fprintf (pFile, "%c\r", alphabet_num[i][k]);
            fprintf(pFile, "\r");
        }
        fprintf (pFile, "\rm_Sla\r");

        fclose (pFile);
    }
    else
    {
        fprintf(stderr,"\nCan't open file.\n");
    }
}
/////////////////////////////////////
void work()
{
    while(len <= max)
    {
        //вывод num
        char str[256];
        char *ptr_str = str;

        if(prefix[0])
        {
            char *ptr = prefix;
            while(*ptr)
            {
                *ptr_str++ = *ptr++;
            }
        }

        size_t i = 0;
        while(num[i])
        {
            *ptr_str = alphabet_num[i][num[i] - 1];
            i++;
            ptr_str++;
        }

        if(suffix[0])
        {
            char *ptr = suffix;
            while(*ptr)
            {
                *ptr_str++ = *ptr++;
            }
        }

        *ptr_str = 0;
        puts(str);

        if(stop)
        {
            save();
            break;
        }

        // увеличиваем num на 1
        i = 0;
        size_t carry = 0;
        do
        {
            num[i]++;
            if(num[i] > scale_of_notation[i])
            {
                num[i] = 1;
                carry = 1;
            }
            else
            {
                carry = 0;
            }

            i++;
        }
        while(carry);
        if(i > len) len=i;
    }
}
/////////////////////////////////////
void run( char *alphabet)
{
    // инициализация
    if(!file_name_to_save[0])
        strcpy(file_name_to_save,"pwdgen.sav");

    len = min;
    for(size_t i=0; i < min; i++)
        num[i] = 1;

    for(size_t i=0; i <= max; i++)
    {
        alphabet_num[i]=alphabet;
        scale_of_notation[i]=strlen(alphabet);
    }

    work();
}/////////////////////////////////////

struct option_result
{
    size_t code;
    char *param;
};

struct option
{
    char *opt;
    size_t code;
};

struct option options[] =
{
    {"lower",1},
    {"punct",2},
    {"upper",3},
    {"xdigit",4},
    {"digit",5},
    {"\0x00",0}
};

struct option options2[] =
{
    {"prefix=",1001},
    {"suffix=",1002},
    {"save=",1003},
    {"\0x00",0}
};

/////////////////////////////////////
struct option_result find_option(char *option)
{
    struct option_result result = {0,0};

    for(size_t i=0; *options[i].opt; i++)
        if (strcmp( option, options[i].opt) == 0)
        {
            result.code = options[i].code;
            options[i].code = 0;
            return result;
        }

    for(size_t i=0; *options2[i].opt; i++)
        if (strstr( option, options2[i].opt) != NULL)
        {
            result.param = strstr( option, options2[i].opt) + strlen(options2[i].opt);
            result.code = options2[i].code;
            options2[i].code = 0;
            return result;
        }

    return result;
}
/////////////////////////////////////
int main(int argc,char **arg, char **env)
{
    if (signal(SIGINT, sig_handler) == SIG_ERR)
        fprintf(stderr,"\ncan't catch SIGINT\n");

    if (argc > 1 && strstr( arg[1], "continue")  != NULL)
    {
        fprintf(stderr,"Continue.\n");

        if( *(arg[1] + strlen("continue")) )
            strcpy(file_name_to_save, arg[1] + strlen("continue") + 1);
        else
            strcpy(file_name_to_save,"pwdgen.sav");

        fprintf(stderr,"Read: %s\n", file_name_to_save);

        load();
        work();
        return 0;
    }
    if (argc < 3)
    {
        fprintf(stderr,"\nPassword Generation 2.0 (c) m_Sla and SQL.RU. Written in 'C' :)\n");
        fprintf(stderr,"Special thnx to: Mayton, Dima T.\n");
        fprintf(stderr,"\nUsage: pwdgen [n | continue=] [m] [options..] \n");
        fprintf(stderr,"\n       continue=  - Filename");
        fprintf(stderr,"\nWhere: options:\n");
        fprintf(stderr,"\n       lower      - Lowercase alphabetic characters [a..z]");
        fprintf(stderr,"\n       punct      - Punctuation characters [,!?..]");
        fprintf(stderr,"\n       upper      - Uppercase alphabetic characters [A..Z]");
        fprintf(stderr,"\n       xdigit     - Hexidecimal characters");
        fprintf(stderr,"\n       digit      - Numeric digits [0..9]");
        fprintf(stderr,"\n       prefix=    - Various text prefix in begin of password phraze like 'Passw_'");
		fprintf(stderr,"\n       suffix=    - Various text suffix");
		fprintf(stderr,"\n       save=      - Filename");
        fprintf(stderr,"\n");
        return -1;
    }
    else
    {
        min = atoi(arg[1]);
        max = atoi(arg[2]);
        if( min > 255) min=255;
        if( max > 255) max=255;

        if(max < min)
        {
            fprintf(stderr,"\n[m] cannot be less than [n]!\n");
            return -3;
        }

        if (argc==3)
        {
            strcat(alphabet, partLower);
            run( alphabet );
            return 0;
        }
        else
        {
            size_t i = 3;
            while(i<argc)
            {
                struct option_result result=find_option(arg[i]);
                switch(result.code)
                {
                case 1: // lower
                    strcat(alphabet,partLower);
                    break;
                case 2: // punct
                    strcat(alphabet,partPunct);
                    break;
                case 3: // upper
                    strcat(alphabet,partHex);
                    strcat(alphabet,partUpper);
                    break;
                case 4: // xdigit
                    strcat(alphabet,partDigit);
                    strcat(alphabet,partHex);
                    break;
                case 5: // digit
                    strcat(alphabet,partDigit);
                    break;

                case 1003: // save=
                    if(strlen(result.param))
                        strcpy(file_name_to_save,result.param);
                    break;
                case 1001: // prefix=
                    if(strlen(result.param))
                        strcpy(prefix,result.param);
                    break;
                case 1002: // suffix=
                    if(strlen(result.param))
                        strcpy(suffix,result.param);
                    break;
                }
                i++;
            }

            if(!strlen(alphabet)) strcat(alphabet, partLower);
            run( alphabet );
        }
    }
    return 0;
}
/////////////////////////////////////

...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812702
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круть. Pwdgen практически готов. Далее - будет более сложная
задача. Ждите новых тяпничных хакатонов.

Мне нужно провести кое-какие исследования DES-кодера.
В частности уйти от дискретности и подойти к непрерывности.
Без этого невозможно решать поиск DES-key для большинства
типовых файловых заголовков.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812744
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ частности уйти от дискретности и подойти к непрерывности

Как заговорили на CPP :D
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812947
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Это понты :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38812954
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно. Это пятничные понты.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38813123
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКруть. Pwdgen практически готов. Далее - будет более сложная задача
жду последнюю версию(до более сложной задачи), надеюсь вы её покажете :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38813218
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Revision: 9
Author: mayton
Date: Friday, November 21, 2014 1:11:13 PM
Message:
m_Sla: some changes.
----
Modified : /branches/m_Sla/main.cpp

...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38813310
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonКруть. Pwdgen практически готов. Далее - будет более сложная задача
жду последнюю версию(до более сложной задачи), надеюсь вы её покажете :)
Коллеги.

Я ухожу в хибернейт на выходные. Буду долго думать над DES-encoder-ом
И нечёткой логикой. Буду ставить этот чортов Пингвин на 32-битный сарай с IDE
диском. Буду собирать статистику по сигнатурам. Буду есть яблоки и печеньки.

А вы не скучайте. Вот вам обещаный пятничный хакатон.
http://www.sql.ru/forum/1128071/tyapnichnyy-animated-gif-chessplayer

Удачи.

P.S. Возможно я и появлюсь здесь если появятся новости.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38813374
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Буду ставить этот чортов Пингвин на 32-битный сарай с IDE
диском.
Оно тебе надо? Сначала нудное шаманство с дровами, потом будет жужжать дряхлыми вентиляторами и винтом хрустеть :)

Не проще в виртуалке запустить?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38813383
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрим. Может и не надо. Часик два потрачу на него - потом плюну. Ноут тоже
слабоват для виртуалок. По диску слабоват. 2.5-inch HDD. При том что уменя вечно
открыта среда разработки с дебагом.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38813414
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставишь, затести производительность, бенчмарки позапускай какие-нибудь.
Я так понял у тебя там какой-то селерон времен мамонтов. Если так, то виртуалка в современном смартфоне и та быстрее может оказаться.
Народ виндовс на часы ставит в эмулятор x86 (считай программная эмуляция проца)
http://geektimes.ru/post/239317/


PS Нашел тут год назад в завалах ноут Pentium-M 1,5 ГГц 512 памяти, пыль сдул, поставил туда пингвина (не без шаманства с дровами), грузится, работает, по инету можно еще полазить, а примитивные флэш игры томозят как пошаговые стратегии.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38813446
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1. Я уже много раз ворчал что ноуты и планшеты покупают не под задачи а под современный
браузер и кино в H.264.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38814111
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погонял тесты, тормозит puts.
Для вывода сделал буфер:
Код: 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.
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.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

char *partLower    = "abcdefghijklmnopqrstuvwxyz";
char *partDigit    = "0123456789";
char *partHex      = "ABCDEF";
char *partUpper    = "GHIJLKMNOPQRSTUVWXWY";
char *partPunct    = "!@#$%^&()-=+.,~`;/\\?*:|\"<>_";

char alphabet[256];

size_t num[256];
size_t scale_of_notation[256];
char *alphabet_num[256];
size_t len;
size_t min;
size_t max;
char file_name_to_save[256];
char prefix[256];
char suffix[256];


size_t stop = 0;

/////////////////////////////////////
void sig_handler(int signo)
{
    if (signo == SIGINT)
    {
        fprintf(stderr,"received signal\n");
        stop = 1;
    }
}
/////////////////////////////////////
void load()
{
    FILE * pFile = fopen (file_name_to_save,"r+");

    if (pFile!=NULL)
    {
        fscanf(pFile, "%d,%d,%d\r", &min, &max, &len);
        fscanf(pFile, "%s\r%s\r%s\r", file_name_to_save, prefix, suffix);
        if( strcmp( prefix, "(null)") == 0) prefix[0]=0;
        if( strcmp( suffix, "(null)") == 0) suffix[0]=0;

        for(size_t i=0; i<max+1; i++)
            fscanf(pFile, "%d,%d,", &num[i], &scale_of_notation[i]);
        fscanf(pFile, "\r");

        for(size_t i=0; i<max+1; i++)
        {
            alphabet_num[i] = calloc(256, 1);
            for(size_t k=0; k<scale_of_notation[i]; k++)
                fscanf(pFile, "%c\r", &alphabet_num[i][k]);
            fscanf(pFile, "\r");
        }

        char str[256]; str[0]=0;
        fscanf (pFile, "\r%s\r", &str[0]);
        if(strcmp( str, "m_Sla") != 0)
        {
            fprintf(stderr,"\nBad file.\n");
            exit(-10);
        }

        fclose (pFile);
    }
    else
    {
        fprintf(stderr,"\nCan't open file.\n");
    }
}
/////////////////////////////////////
void save()
{
    FILE * pFile = fopen (file_name_to_save,"w+");

    if (pFile!=NULL)
    {
        fprintf (pFile, "%d,%d,%d\r", min, max, len);
        if(!prefix[0])strcpy(prefix,"(null)");
        if(!suffix[0])strcpy(suffix,"(null)");
        fprintf (pFile, "%s\r%s\r%s\r", file_name_to_save, prefix, suffix);

        for(size_t i=0; i<max+1; i++)
            fprintf (pFile, "%d,%d,", num[i],scale_of_notation[i]);
        fprintf(pFile, "\r");

        for(size_t i=0; i<max+1; i++)
        {
            for(size_t k=0; k<scale_of_notation[i]; k++)
                fprintf (pFile, "%c\r", alphabet_num[i][k]);
            fprintf(pFile, "\r");
        }
        fprintf (pFile, "\rm_Sla\r");

        fclose (pFile);
    }
    else
    {
        fprintf(stderr,"\nCan't open file.\n");
    }
}
/////////////////////////////////////
void work()
{
    char *str = malloc(1024*1024);
    char *ptr_str = str;

    while(len <= max)
    {
        //вывод num
        if(prefix[0])
        {
            char *ptr = prefix;
            while(*ptr)
            {
                *ptr_str++ = *ptr++;
            }
        }

        size_t i = 0;
        while(num[i])
        {
            *ptr_str = alphabet_num[i][num[i] - 1];
            i++;
            ptr_str++;
        }

        if(suffix[0])
        {
            char *ptr = suffix;
            while(*ptr)
            {
                *ptr_str++ = *ptr++;
            }
        }
        *ptr_str++ = '\n';

        if(ptr_str - str > 1024*1024 - 256)
        {
            *ptr_str = 0;
            puts(str);
            ptr_str = str;
        }

        if(stop)
        {
            save();
            break;
        }

        // увеличиваем num на 1
        i = 0;
        size_t carry = 0;
        do
        {
            num[i]++;
            if(num[i] > scale_of_notation[i])
            {
                num[i] = 1;
                carry = 1;
            }
            else
            {
                carry = 0;
            }

            i++;
        }
        while(carry);
        if(i > len) len=i;
    }

    *ptr_str = 0;
    puts(str);
    free(str);
}
/////////////////////////////////////
void run( char *alphabet)
{
    // инициализация
    if(!file_name_to_save[0])
        strcpy(file_name_to_save,"pwdgen.sav");

    len = min;
    for(size_t i=0; i < min; i++)
        num[i] = 1;

    for(size_t i=0; i <= max; i++)
    {
        alphabet_num[i]=alphabet;
        scale_of_notation[i]=strlen(alphabet);
    }

    work();
}/////////////////////////////////////

struct option_result
{
    size_t code;
    char *param;
};

struct option
{
    char *opt;
    size_t code;
};

struct option options[] =
{
    {"lower",1},
    {"punct",2},
    {"upper",3},
    {"xdigit",4},
    {"digit",5},
    {"\0x00",0}
};

struct option options2[] =
{
    {"prefix=",1001},
    {"suffix=",1002},
    {"save=",1003},
    {"\0x00",0}
};

/////////////////////////////////////
struct option_result find_option(char *option)
{
    struct option_result result = {0,0};

    for(size_t i=0; *options[i].opt; i++)
        if (strcmp( option, options[i].opt) == 0)
        {
            result.code = options[i].code;
            options[i].code = 0;
            return result;
        }

    for(size_t i=0; *options2[i].opt; i++)
        if (strstr( option, options2[i].opt) != NULL)
        {
            result.param = strstr( option, options2[i].opt) + strlen(options2[i].opt);
            result.code = options2[i].code;
            options2[i].code = 0;
            return result;
        }

    return result;
}
/////////////////////////////////////
int main(int argc,char **arg, char **env)
{
    if (signal(SIGINT, sig_handler) == SIG_ERR)
        fprintf(stderr,"\ncan't catch SIGINT\n");

    if (argc > 1 && strstr( arg[1], "continue")  != NULL)
    {
        fprintf(stderr,"Continue.\n");

        if( *(arg[1] + strlen("continue")) )
            strcpy(file_name_to_save, arg[1] + strlen("continue") + 1);
        else
            strcpy(file_name_to_save,"pwdgen.sav");

        fprintf(stderr,"Read: %s\n", file_name_to_save);

        load();
        work();
        return 0;
    }
    if (argc < 3)
    {
        fprintf(stderr,"\nPassword Generation 2.0 (c) m_Sla and SQL.RU. Written in 'C' :)\n");
        fprintf(stderr,"Special thnx to: Mayton, Dima T.\n");
        fprintf(stderr,"\nUsage: pwdgen [n | continue=] [m] [options..] \n");
        fprintf(stderr,"\n       continue=  - Filename");
        fprintf(stderr,"\nWhere: options:\n");
        fprintf(stderr,"\n       lower      - Lowercase alphabetic characters [a..z]");
        fprintf(stderr,"\n       punct      - Punctuation characters [,!?..]");
        fprintf(stderr,"\n       upper      - Uppercase alphabetic characters [A..Z]");
        fprintf(stderr,"\n       xdigit     - Hexidecimal characters");
        fprintf(stderr,"\n       digit      - Numeric digits [0..9]");
        fprintf(stderr,"\n       prefix=    - Various text prefix in begin of password phraze like 'Passw_'");
		fprintf(stderr,"\n       suffix=    - Various text suffix");
		fprintf(stderr,"\n       save=      - Filename");
        fprintf(stderr,"\n");
        return -1;
    }
    else
    {
        min = atoi(arg[1]);
        max = atoi(arg[2]);
        if( min > 255) min=255;
        if( max > 255) max=255;

        if(max < min)
        {
            fprintf(stderr,"\n[m] cannot be less than [n]!\n");
            return -3;
        }

        if (argc==3)
        {
            strcat(alphabet, partLower);
            run( alphabet );
            return 0;
        }
        else
        {
            size_t i = 3;
            while(i<argc)
            {
                struct option_result result=find_option(arg[i]);
                switch(result.code)
                {
                case 1: // lower
                    strcat(alphabet,partLower);
                    break;
                case 2: // punct
                    strcat(alphabet,partPunct);
                    break;
                case 3: // upper
                    strcat(alphabet,partHex);
                    strcat(alphabet,partUpper);
                    break;
                case 4: // xdigit
                    strcat(alphabet,partDigit);
                    strcat(alphabet,partHex);
                    break;
                case 5: // digit
                    strcat(alphabet,partDigit);
                    break;

                case 1003: // save=
                    if(strlen(result.param))
                        strcpy(file_name_to_save,result.param);
                    break;
                case 1001: // prefix=
                    if(strlen(result.param))
                        strcpy(prefix,result.param);
                    break;
                case 1002: // suffix=
                    if(strlen(result.param))
                        strcpy(suffix,result.param);
                    break;
                }
                i++;
            }

            if(!strlen(alphabet)) strcat(alphabet, partLower);
            run( alphabet );
        }
    }
    return 0;
}
/////////////////////////////////////

В итоге с "pwdgen 6 6 prefix=_Passsssssssssssssss suffix=_Passsssssssssssssss > 123.lst" мой ssd не справился
Средняя скорость получилась 189 Мбайт/сек.
Надо более быстрый ssd
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38814152
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaВ итоге с "pwdgen 6 6 prefix=_Passsssssssssssssss suffix=_Passsssssssssssssss > 123.lst" мой ssd не справился
Средняя скорость получилась 189 Мбайт/сек.
Круть. Закоммитил. Думаю на этом можно остановиться. В конвейере с генерацией ключа и
прочими процедурами pwdgen уже не будет являться bottleneck-ом.

P.S. Щас занимаюсь FuzzyLogic. Для вентилей AND/OR/NOT всё успешно. Но для XOR
есть трудности.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38814153
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо более быстрый ssd
Не стоит. Нужен обычный хард с файловой системой расчитанной на
огромное количество мелких файлов. Возможно ReizerFS...
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38814260
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я собрал статистику по 25 тысячам jpeg файлам что у меня нашлись локально.
Точнее по их заголовкам (первые 512 бит). Цифру 512 я взял из расчёта
возможной полезности при анализе блочных шифров.

Следующая биткарта показывает заголовок. Биты идут в порядке старшинства.
Знаком ? отмечены шумящие поля.

Код: plaintext
1.
2.
3.
4.
11111111 11011000 11111111 1110???? 00000000 ???????0 0100???? 01?????0 01?01?01 01?00110 00?00000 0000000? 0??0?0?? 0?00?00? 00?0???? ???????? 
0000???? ???????? 00?00000 0?0000?0 ???????? ???????? 00?????? ???????? 0?0????? 0??????? 0??????? 0??????? 0??????? 0??????? 0??????? 0??????? 
0??????? 0??????? 0??????? 0??????? 0??????? 0??????? ???????? ???????? ???????? ???????? 0??????? ???????? ???????? ???????? 0??????? 0??????? 
???????? 0??????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? 0??????? ???????? ???????? ???????? ???????? 0??????? ????????



Более подробная гистограмма (для экономии места привожу первые 64 бит). Под спойлер.

Код: 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.
0 : 0.998899 
1 : 0.999429 
2 : 0.999185 
3 : 0.999185 
4 : 0.999226 
5 : 0.999755 
6 : 0.999389 
7 : 0.999429 
8 : 0.998777 
9 : 0.999796 
10 : 0.000122 
11 : 0.998859 
12 : 0.999755 
13 : 0.000122 
14 : 0.000041 
15 : 0.000693 
16 : 0.998818 
17 : 0.999837 
18 : 0.998818 
19 : 0.999144 
20 : 0.998859 
21 : 0.999837 
22 : 0.999511 
23 : 0.998777 
24 : 0.998818 
25 : 0.999185 
26 : 0.999266 
27 : 0.003750 
28 : 0.012106 
29 : 0.011332 
30 : 0.011209 
31 : 0.029593 
32 : 0.000041 
33 : 0.001875 
34 : 0.003057 
35 : 0.004198 
36 : 0.003505 
37 : 0.003424 
38 : 0.002935 
39 : 0.005910 
40 : 0.024212 
41 : 0.024579 
42 : 0.027759 
43 : 0.962989 
44 : 0.013737 
45 : 0.037215 
46 : 0.036196 
47 : 0.006073 
48 : 0.000489 
49 : 0.998981 
50 : 0.000489 
51 : 0.000489 
52 : 0.959605 
53 : 0.032161 
54 : 0.962092 
55 : 0.037745 
56 : 0.000041 
57 : 0.998573 
58 : 0.039702 
59 : 0.029104 
60 : 0.032120 
61 : 0.966902 
62 : 0.959687 
63 : 0.003057 



Как видим для блочного DES-анализа JPEG является трудной мишенью. Биты шумят и уменя пока нет
аппарата который позволил-бы делать обратную операцию для протаскивания шумящей характеристики
через все раунды DES.

А вот PNG более удачен. Его сигнатура фиксирована и выглядит так.

89 50 4E 47 0D 0A 1A 0A

Собраны также характеристики еще по 5 други популярным форматам.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38829580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне так и не удалось сформировать алгебру нечеткой логики для операции XOR.
Я для себя выяснил что probability A XOR B нельзя расчитать зная просто
prob(A), prob(B) как в случаях с NOT/OR/AND.

prob(A XOR B) возможно удастся выразить через корреляцию.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38829860
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борхес. Этот чортов старик учУдил офигенскую формулу. Все книги мира.
Даже еще не написанные.

Код: plaintext
1.
$ pwdgen 1312000 custom=abcdefghijklmnopqrstuvwxyz.,_



По его версии 410 страниц отпечатанных на латыни (английский)
в формате 80 на 40 знаков - это офигенский универсум. И как-бе
включает в себя и Библию и Коран и дофигища еретических учений.
Кириллицу и всё остальное он поскипал. Ну да ладно. Допилим потом.

P.S. Правда Борхес требует вместо символа _ поставивить пробел. Но я допилю это
чуть позже. И чтобы не создавать весьма унылую картину монотонной последовательности
обязательно нужна опция shuffle=yes.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38843704
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артур Кларк. 9 000 000 000 имён Бога.

Правда внешний вид символа Писатель не упоминает.
Пускай будут буквы от 'a' до 'i'

Код: plaintext
1.
$ pwdgen 9 custom=abcdefghi | filter3letter >> out.txt


классик - Назовите это культом, если хотите, но речь идет о важной составной
части нашего вероисповедания. Употребляемые нами имена Высшего Существа -
Бог, Иегова, Аллах и так далее - всего-навсего придуманные человеком ярлыки.
Тут возникает довольно сложная философская проблема, не стоит сейчас ее
обсуждать, но среди всех возможных комбинаций букв кроются, так сказать,
действительные имена бога. Вот мы и пытаемся выявить их, систематически
переставляя буквы.
- Понимаю. Вы начали с комбинации ААААААА... и будете продолжать, пока
не дойдете до ЯЯЯЯЯЯЯ...
- Вот именно. С той разницей, что мы пользуемся азбукой, которую
изобрели сами. Заменить литеры в пишущем устройстве, разумеется, проще
всего. Гораздо сложнее создать схему, которая позволит исключить заведомо
нелепые комбинации. Например, ни одна буква не должна повторяться более трех
раз подряд.
- Трех? Вы, конечно, хотели, сказать - двух.
- Нет, именно трех. Боюсь, что объяснение займет слишком много времени,
даже если бы вы знали наш язык.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38881218
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Revision: 12
Author: mayton
Date: Monday, February 16, 2015 10:53:37 PM
Message:
performance improovement
----
Modified : /src/pwdgen.c


...
Рейтинг: 0 / 0
188 сообщений из 188, показаны все 8 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничный pwdgen
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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