powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Авторизация без сервера
25 сообщений из 117, страница 3 из 5
Авторизация без сервера
    #39754759
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TDima TПогуглил немного: оказывается RSA c 32-битным ключом это пара десятков строк кода ))) Пошел писать.
Строк мало, а в 32 бита вписаться проблематично :( Есть проблемы с генерацией ключей.какие проблемы то? гдет тема была с генерацией простых чисел

фигня только выйдет, взламывается на ура тупым перебором
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754799
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.
	// Создание ключей
	rand_init(); // Инициализация ГСЧ
	uint32_t p, q, n, y, e, d;
	while (true) { // для возврата при переполнении
		cout << "Please wait... Key generation procces." << endl;
		// 1. Выбираются два различных случайных простых числа p и q заданного размера.
		do {
			p = rand32_prime(1024, 65535); // случайное простое в диапазоне от ... до ...
			q = rand32_prime(1024, 65535);
			// 2. Вычисляется их произведение n = p * q, которое называется модулем.
			n = p * q;
		} while(n < 0xFFFFF || n > 0xFFFFFF); // для шифрования двухбайтовых значений 
		// 3. Вычисляется значение функции Эйлера от числа n: y = (p - 1) * (q - 1)
		y = (p - 1)*(q - 1);
		// 4. Выбирается целое число e ( 1 < e < y) взаимно простое со значением y
		do {
			//e = rand32(5, y - 1); // rand32() случайное в диапазоне от ... до ...
			e = rand32(32, 255); // при больших e не хватает разрядности при подборе d
		} while (gcd(e, y) != 1);
		// 5. Вычисляется число d, удовлетворяющее сравнению (e*d) % y = 1
		uint32_t d_max = 4294967295 / e - 1; // наибольшее d 32 бита
		d = rand32(y / e, d_max);
		while (d < d_max && e*d % y != 1) {
			d++;
		}
		if (d < d_max) break;
	}
	// Готово: {e,n} - открытый ключ, {d,n} - закрытый ключ


Далее шифрование
Код: plaintext
1.
uint32_t crypt = pow_mod(data, e, n);


и расшифровка
Код: plaintext
1.
uint32_t decrypt = pow_mod(crypt, d, n);


где
Код: plaintext
1.
2.
3.
pow_mod(base, exp, n) { 
   return (base ^ exp) % n; // Формула из учебников, чтобы понятно было
}


Тут еще один вопрос: я не совсем понимаю про допустимую разрядность шифруемого. Т.к. в итоге происходит "% n", то могу ли я ожидать что все значения до n (0 <= x < n) будут корректно зашифрованы и расшифрованы?
Планирую двухбайтными блоками шифровать, плюс флаг для указания что один байт зашифрован, т.е. шифруемые значения 0 <= x <= 0x100FF. Поэтому ограничил 0x100000 <= n <= 0xFFFFFF. Т.е. минимальный n почти в 16 раз больше максимального шифруемого.
Тесты погоняю, но ключей множество, все комбинации не проверить. Хотелось бы найти какое-то мат.доказательство.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754802
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Тут еще один вопрос: я не совсем понимаю про допустимую разрядность шифруемого. Т.к. в итоге происходит "% n", то могу ли я ожидать что все значения до n (0 <= x < n) будут корректно зашифрованы и расшифрованы?
не все, ограничение из теоремы Эйлера
m, p1, p2 - должны быть взаимнопросты
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754804
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T Тут еще один вопрос: я не совсем понимаю про допустимую разрядность шифруемого. Т.к. в итоге происходит "% n", то могу ли я ожидать что все значения до n (0 <= x < n) будут корректно зашифрованы и расшифрованы?
не все, ограничение из теоремы Эйлера
m, p1, p2 - должны быть взаимнопросты
В смысле для pow_mod(base, exp, n) взаимнопросты exp и n, т.к. специально генерятся, а base тоже должно быть взимнопростое к exp и n?
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754805
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// 5. Вычисляется число d, удовлетворяющее сравнению (e*d) % y = 1
		uint32_t d_max = 4294967295 / e - 1; // наибольшее d 32 бита
		d = rand32(y / e, d_max);
		while (d < d_max && e*d % y != 1) {
			d++;
		}
		if (d < d_max) break;


вот это нехорошо, гугли расширенный алгоритм Евклида
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754806
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tkealon(Ruslan)пропущено...
не все, ограничение из теоремы Эйлера
m, p1, p2 - должны быть взаимнопросты
В смысле для pow_mod(base, exp, n) взаимнопросты exp и n, т.к. специально генерятся, а base тоже должно быть взимнопростое к exp и n?не к експоненте, а к p и q
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754820
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima Tпропущено...

В смысле для pow_mod(base, exp, n) взаимнопросты exp и n, т.к. специально генерятся, а base тоже должно быть взимнопростое к exp и n?не к експоненте, а к p и q
Добавил тупой перебор
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	for (uint32_t i = 0; i != 65792; i++) {
		uint32_t crypt = pow_mod(i, e, n);
		uint32_t decrypt = pow_mod(crypt, d, n);
		if (i != decrypt) {
			cout << "!!! ERROR: crypt " << i << " decrypt " << decrypt << endl;
			break;
		}
	}


Не срабатывает, хотя вот например значения
Код: plaintext
1.
2.
{6449,1823} - {p, q}
{253,11756527} - {e,n}
{15138069,11756527} - {d,n}

Как понимаю должно сглючить на каждом кратном 1823, т.е. 3646, 5469, 7292, 9115 и т.д. но работает.

Оставим этот вопрос открытым, пока просто добавлю эту проверку в генерацию ключей.

kealon(Ruslan)вот это нехорошо, гугли расширенный алгоритм Евклида
Евклида загуглил, спасибо за подсказку, а то хотел свой велосипед изобретать.

kealon(Ruslan)фигня только выйдет, взламывается на ура тупым перебором
Думаю прежде чем тюнинг устраивать надо перебор запустить: генерить ключи и писать в какой-нибудь std::map, посмотреть как быстро будет увеличиваться количество уникальных комбинаций, как часто повторы случаются.
Если их относительно немного получится, например миллиард, то можно сложить их в табличку и по открытому ключу получать закрытый.

Написал, посмотрел код:
Код: plaintext
1.
0x100000 <= n <= 0xFFFFFF
32 <= e <= 255
т.е. n максимум 2^24, e - 2^8 итого максимум 2^32 комбинаций или 4 лярда, которые уже в табличку влазят. Причем не все комбинации допустимы, т.е. допустимых комбинаций будет намного меньше. Печалька (((

Для начала разрядность n и e надо повысить.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754848
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДумаю прежде чем тюнинг устраивать надо перебор запустить: генерить ключи и писать в какой-нибудь std::map, посмотреть как быстро будет увеличиваться количество уникальных комбинаций, как часто повторы случаются.
Если их относительно немного получится, например миллиард, то можно сложить их в табличку и по открытому ключу получать закрытый.

Написал, посмотрел код:
Код: plaintext
1.
0x100000 <= n <= 0xFFFFFF
32 <= e <= 255
т.е. n максимум 2^24, e - 2^8 итого максимум 2^32 комбинаций или 4 лярда, которые уже в табличку влазят. Причем не все комбинации допустимы, т.е. допустимых комбинаций будет намного меньше. Печалька (((

Для начала разрядность n и e надо повысить.Зачем???
просто n разложить на множители и дальше расчёт ключей тривиален - вот и весь "взлом"
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754937
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)просто n разложить на множители и дальше расчёт ключей тривиален - вот и весь "взлом"
Точно. На перебор всех простых от 2 до sqrt(n) надо меньше секунды. Потом немного перебора с подбором d.

Все равно допилю, без исходников сложно понять что это за алгоритм. А в случае необходимости всегда можно перейти на полноценный RSA.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754940
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// 5. Вычисляется число d, удовлетворяющее сравнению (e*d) % y = 1
		uint32_t d_max = 4294967295 / e - 1; // наибольшее d 32 бита
		d = rand32(y / e, d_max);
		while (d < d_max && e*d % y != 1) {
			d++;
		}
		if (d < d_max) break;


вот это нехорошо, гугли расширенный алгоритм Евклида
Алгоритм нагуглил , только как его тут применить не понимаю.
Алгоритм Евклида можно расширить так, что он не только даст НОД(a,b)=d, но и найдет целые числа x и y, такие что ax + by = d.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754948
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде нашел как
https://foxford.ru/wiki/informatika/rasshirennyy-algoritm-evklida Одним из применений расширенного алгоритма Евклида является нахождение обратного элемента в кольце вычетов по модулю....
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754956
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭлементарно: если кто-то назовется Алисой, то при этом реальная Алиса зайти не сможет, поэтому она позвонит и скажет: "ваша корявая прога не работает".
Вопрос не во входе, вопрос в регистрации нового пользователя. В системе ещё нет Алисы. Как Алиса докажет, что это она Алиса, а не Хрен-с-горы, который ею представился час назад?
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754978
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВроде нашел как
https://foxford.ru/wiki/informatika/rasshirennyy-algoritm-evklida Одним из применений расширенного алгоритма Евклида является нахождение обратного элемента в кольце вычетов по модулю....
не помню откуда брал, нерекурсивный вариант:
Код: pascal
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.
// ax + by = gcd(a,b)
procedure gcdMain(a, b: TInt; out x, y, d: TInt);
var
  q, r, x1, x2, y1, y2: TInt;
begin
  if (b = 0) then
  begin
    d := a;
    x := 1;
    y := 0;
    Exit;
  end;

  x2 := 1;
  x1 := 0;
  y2 := 0;
  y1 := 1;
  while (b > 0)do
  begin
    q := a div b;
    r := a - q * b;
    x := x2 - q * x1;
    y := y2 - q * y1;

    a := b;
    b := r;
    x2 := x1;
    x1 := x;
    y2 := y1;
    y1 := y;
  end;
  d := a;
  x := x2;
  y := y2;
end;
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754981
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TЭлементарно: если кто-то назовется Алисой, то при этом реальная Алиса зайти не сможет, поэтому она позвонит и скажет: "ваша корявая прога не работает".
Вопрос не во входе, вопрос в регистрации нового пользователя. В системе ещё нет Алисы. Как Алиса докажет, что это она Алиса, а не Хрен-с-горы, который ею представился час назад?
Это-то тут при чем? Тут каждый сам решает как при регистрации убедиться что пользователь тот за кого себя выдает.
Эта проблема не этого топика, но она мне известна, как-то ее тоже надо будет решать, как один из вариантов вводить спец.учетку(и) админа: юзер саморегается, но изначально получает права писать только админам, передает админам инфу о себе, на основании полученной инфы админ дает серверу команду подтверждения или удаления новичка. В общем это тема для отдельного топика.

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

Например резервное копирование: есть получатель "backup", ему сообщил что слать файлы могут "proga1", "proga2" и "proga3". От этих учеток принимает, остальным пишет "Извините, а вы кто?"
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754982
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)не помню откуда брал, нерекурсивный вариант:

Спасибо. А то в инете только с рекурсией.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754984
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tkealon(Ruslan)не помню откуда брал, нерекурсивный вариант:

Спасибо. А то в инете только с рекурсией.та нет, мусорка просто та ещё

тынц
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39754999
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)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.
// Расширенный алгоритм Евклида. ax + by = gcd(a,b)
uint32_t gcdext(uint32_t a, uint32_t b, int32_t & x, int32_t & y) {
	if (b == 0) {
		x = 1; y = 0;
		return b;
	}

	uint32_t q, r;
	int32_t x1, x2, y1, y2;

	x2 = 1;
	x1 = 0;
	y2 = 0;
	y1 = 1;
	while (b > 0) {
		q = a / b;
		r = a - q * b;
		x = x2 - q * x1;
		y = y2 - q * y1;

		a = b;
		b = r;
		x2 = x1;
		x1 = x;
		y2 = y1;
		y1 = y;
	}
	x = x2;
	y = y2;
	return a;
}


Вроде работает
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755014
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затестил перебор. За полчаса нагенерил 7 млн. пар ключей, количество уникальных остановилось на 3`607`581 и даже по одному не добавляется. Можно ломать таблицей ключей )))

Понаблюдаю еще пару часов.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755017
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima Tпропущено...

Строк мало, а в 32 бита вписаться проблематично :( Есть проблемы с генерацией ключей.какие проблемы то? гдет тема была с генерацией простых чисел

фигня только выйдет, взламывается на ура тупым перебором
Тест Миллера-рабина применяется. Для чисел которые во много раз больше чем мы генерили несколько лет назад.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755018
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТест Миллера-рабина применяется. Для чисел которые во много раз больше чем мы генерили несколько лет назад.этот тест для проверки простоты числа используется, когда ищут пару для ключа.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755025
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗатестил перебор. За полчаса нагенерил 7 млн. пар ключей, количество уникальных остановилось на 3`607`581 и даже по одному не добавляется. Можно ломать таблицей ключей )))

Понаблюдаю еще пару часов.
Полтора часа прошло, 27 млн. обработано, а уникальных те же 3`607`581. Все понятно, вырубаю.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755116
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается Тест Миллера — Рабина иногда имеет ложноположительные срабатывания
Однако, с его помощью нельзя строго доказать простоту числа. Тем не менее тест Миллера — Рабина часто используется в криптографии для получения больших случайных простых чисел.
Наткнулся на is_prime(233 * 1103) дает true, я на его основе делаю пару ключей, естественно они не рабочие.

Как с этим бороться?
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755120
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Это нормально.
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755129
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А все-таки, ключ - это одно число, или система чисел?
...
Рейтинг: 0 / 0
Авторизация без сервера
    #39755131
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения криптографии ключ - это просто массив битов.

Но для нашего (человеческого восприятия) мы можем его представлять в виде
- Целого десятичного числа: 12345678
- Двоично десятичного (binhex) Например: 00 FF AB C1
- Base64 - кодированного представления (система счисления с основанием 64)

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

Для симметричной криптографии (например шифр DES) например ключ это просто массив из 56 битов.
Для тройного ДЕС-а - соотвествтенно бутерброд из трех ключей 3*56. И формулы там - другие.
Но в большинстве случаев это просто очень хороший случайный поток битов. Без повторов и авто-корреляций.

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

Выше Дима привёл замечание к методу Раввина-Миллера. Од даёт ложные сообщения о том что число простое.
Но это допустимо. Во первых у него - ошеломительная скорость по сравнению с традиционными методами.
Во вторых он параметризируется числом раундов. (Здесь я точно не помню надо почиать). Ну вобщем
в беря во внимание длинну целых чисел с коротыми он работает - его предсказание простоты вполне
себе подходит для практических задач.
...
Рейтинг: 0 / 0
25 сообщений из 117, страница 3 из 5
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Авторизация без сервера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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