Форум программистов, компьютерный форум, киберфорум
Криптография
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383

Атака Винера на RSA при экспоненте равной 3

14.10.2019, 17:46. Показов 6443. Ответов 17

Студворк — интернет-сервис помощи студентам
Добрый день ! Стало интересно RSA шифрование . У меня есть RSA-Signature (ASN1) . Есть малая експонента для расшифровки равная 3 . Есть Public Modulus 1024 bit. Ну и соответствено расшифрованный ASN1. Хочу вычислить экспоненту для зашифровки.
Точне произвести так называемую Атаку Винера. Если ли у кого реализация . Очень хотелось бы посмотреть .
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.10.2019, 17:46
Ответы с готовыми решениями:

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

Как вычислить большое число в экспоненте ?
Всем доброго времени суток! Помогите решить проблему: в нижеприведенной формуле функция экспоненты должна возвращать очень большое...

Цена игровой валюты возрастает по экспоненте
Здравствуйте! Забыл курс математики напрочь. Разрабатываю игру в которой улучшения на оружия будут возрастать по экспоненте. Проблема...

17
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
14.10.2019, 18:02
Хабр:
Это все потому, что у кого-то слишком маленькая экспонента: атака Хастада на RSA в задании NeoQUEST-2016
не?
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
14.10.2019, 18:08  [ТС]
Читал )) С Питоном мало знаком . Мне бы что - то на С ))

Добавлено через 2 минуты
И как я понял атака Хастада нужна для вычисления ASN1 . При разных ключах и одинаковом ASN1.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.10.2019, 00:19
Цитата Сообщение от Marchcat Посмотреть сообщение
С Питоном мало знаком
Так знакомься больше. Для опытов над криптографией язык очень подходящий.
Вот моя реализация атаки Винера:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from fractions import Fraction
 
def private_key_by_wiener(e, N):
    alpha = Fraction(e,  N)
    a = int(alpha)
    q, q1 = 1, 0 
    x = 123456788889 # значение с потолка.
    while alpha - a:
        alpha = 1 / (alpha - a)
        a = int(alpha)
        q, q1 = a*q + q1, q
        if x == pow(pow(x, e, N), q, N):
            return q
Там, по хорошему, надо на нескольких случайных x проверять, вроде. Но и так с взятым наобум значением с большой долей вероятности всё будет нормально.
Fraction — это просто представление дроби в виде отдельных числителя и знаменателя, что бы не иметь дел с погрешностями.
Всё остальное вроде вполне очевидно должно быть как реализуется на си. Только про большие числа надо не забывать и использовать gmp какую-нибудь.

Добавлено через 4 минуты
Только по известной маленькой экспоненте большую неизвестную не найти. Наоборот, должна быть известна большая.
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 01:35  [ТС]
мне бы узнать d =< N в 0.292 степени )))

Добавлено через 26 минут
допустим как массив байт превратить в большое число я понял
C#
1
2
byte[] byteArray = { 0xEF, 0x11, 0x34, 0x37, 0x96, 0x15, 0x24, 0x73, 0x42, 0x01, 0x00};
BigInteger N = new BigInteger(byteArray);
а вот как возвести в степень 0.292
если только не найти два числа которые дадут в делении 0.292 (a и b) . и не возвести N в степень a и извлечь корень b
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.10.2019, 15:49
Цитата Сообщение от Marchcat Посмотреть сообщение
мне бы узнать d =< N в 0.292 степени )))
В исходном виде атака Винера работает до N0.25. Моя реализация для этого варианта.

Цитата Сообщение от Marchcat Посмотреть сообщение
а вот как возвести в степень 0.292
Приближённо — можно через логарифм и экспоненту.
C#
1
Math.Exp(BigInteger.Log(N) * 0.292)
А ещё лучше отказаться от экспоненты и сравнивать логарифмы, так не будет проблем с возможным переполнением числа double. Но это всё-равно приближённые числа будут сравниваться.
Для более точного сравнения (хотя бы до конца целой части) всё-равно потребуются специализированные библиотеки для вычислений с произвольной точностью.
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 16:07  [ТС]
Ну 1/4 можно два раза прогнать через квадратный корень и потом разделить на 3 так как экспонента равна 3
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.10.2019, 16:21
Цитата Сообщение от Marchcat Посмотреть сообщение
Ну 1/4 можно два раза прогнать через квадратный корень
Можно. А можно просто взять и вычислить корень четвёртой степени методом Ньютона до последнего знака целой части.
Но к атаке Винера это не особо относится. Там этого всего не надо, если условия уже выполнены.
Цитата Сообщение от Marchcat Посмотреть сообщение
потом разделить на 3 так как экспонента равна 3
Что? Ничего не понял. Зачем делить на экспоненту и почему она равна 3?

Добавлено через 2 минуты
Ах, это та экспонента, которая из исходного вопроса. Экспонента RSA. Ну всё-равно непонятно, зачем на неё делить.
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 16:29  [ТС]
Ну как же . нам надо вычислить d . e равна 3 или на оборот это не имеет значения . И в статье описано что при экспоненте малой . т.е 3 . d=< (1/3) * на N в степени 1/4

Добавлено через 23 секунды
https://ru.wikipedia.org/wiki/RSA
Обобщенная атака Винера

Добавлено через 5 минут
Точнее предел экспоненты
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.10.2019, 17:01
Боюсь, что если одна экспонента равна 3, то другая никак не может быть меньше N0.25.

Добавлено через 16 минут
В статье на Википедии не говорится, что e=3. Коэффициент (1/3) никак не связан с открытой экспонентой. Для того, чтобы секретная экспонента удовлетворяла указанному неравенству открытая экспонента должна быть значительно больше секретной, иначе быть не может чисто математически, ибо e*d > (p-1)*(q-1) и сравнимо по порядку с числом N. Значит если один сомножитель относительно маленький, то другой обязан быть большим.

Добавлено через 1 минуту
если d < N0.25, то e > N0.75.

Добавлено через 4 минуты
В openssl в качестве открытой экспоненты всегда используется 65537, в некоторых других реальных реализациях вполне может использоваться число 3, никакой угрозы само по себе это не несёт, и даже напротив, гарантирует что секретная экспонента будет большой и атака Винера не приведёт к успеху. Возможно тройка даст возможность использовать какие-то другие атаки, но это нужно рассматривать уже отдельно.
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 17:27  [ТС]
Как раз на просторах интернета и говориться что для расшифровки используется малая экспонента . Это и есть осн уязвимость. А такую экспоненту берут что бы в микрочипах была быстрая расшифровка

Добавлено через 1 минуту
Что то не получается у меня расшифровать так ((
C#
1
2
3
4
5
6
7
            BigInteger N = new BigInteger(byteArrayN);
            BigInteger C = new BigInteger(byteArrayC);
            BigInteger M = BigInteger.ModPow(C, 3, N);
 
           // log.AppendText(N.ToString("X2") + "\n" + "\n");
           // log.AppendText(C.ToString("X2") + "\n" + "\n");
            log.AppendText(M.ToString("X2") + "\n" + "\n");
N - модуль
3 - экпонента
С - зашифрованная часть ((

Добавлено через 15 минут
И так то же что-то не хотит
C#
1
2
3
4
5
            BigInteger N = new BigInteger(byteArray);
            BigInteger C = new BigInteger(byteArray2);
            BigInteger A = BigInteger.Pow(C, 3);
            BigInteger M ;
            BigInteger A1 = BigInteger.DivRem(A, N, out M);
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.10.2019, 17:29
Если 3 это секретная экспонента (мы ведь о шифровании, а не о подписи?) то первый код правильный и либо исходные данные неверны, либо неправильно интерпретируются расшифрованные данные.
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 17:34  [ТС]
нет как раз о подписи ASN1.

Добавлено через 2 минуты
Может я что-то не доглядел . Но я думал что подпись накрывается RSA и все ))

Добавлено через 1 минуту
В первом коде ModPow возводит в степень и делитель ( modulo )
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 17:48  [ТС]
Вот что у меня получилось в он-лайн декрипторе
Миниатюры
Атака Винера на RSA при экспоненте равной 3  
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.10.2019, 17:50
выглядит как правильно расшифрованный текст.
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 17:56  [ТС]
так оно и есть . А у себя я не могу это реализовать в обход стандартной rsa библиотеки ((

Добавлено через 4 минуты
вот код кнопки
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        private void button1_Click(object sender, EventArgs e)
        {
            string modulo = t_modulo.Text;
            modulo = modulo.Replace(" ", "");
            int NumberChars = modulo.Length;
            byte[] byteArray = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                byteArray[i / 2] = Convert.ToByte(modulo.Substring(i, 2), 16);
 
            byte[]byteArrayN = new byte[byteArray.Length];
            for (int k = 0; k < byteArray.Length; k++)
            {
                byteArrayN[k] = byteArray[byteArray.Length - 1 - k];
            }
 
 
            string crypt = t_crypt.Text;
            crypt = crypt.Replace(" ", "");
            int NumberChars2 = crypt.Length;
            byte[] byteArray2 = new byte[NumberChars2 / 2];
            for (int i = 0; i < NumberChars2; i += 2)
                byteArray2[i / 2] = Convert.ToByte(crypt.Substring(i, 2), 16);
 
            byte[] byteArrayC = new byte[byteArray2.Length];
            for (int k = 0; k < byteArray2.Length; k++)
            {
                byteArrayC[k] = byteArray2[byteArray2.Length - 1 - k];
            }
 
 
            BigInteger N = new BigInteger(byteArrayN);
            BigInteger C = new BigInteger(byteArrayC);
            BigInteger A = BigInteger.Pow(C, 3);
            BigInteger M ;
            BigInteger A1 = BigInteger.DivRem(A, N, out M);
 
            log.AppendText(N.ToString("X2") + "\n" + "\n");
            log.AppendText(C.ToString("X2") + "\n" + "\n");
            log.AppendText(M.ToString("X2") + "\n" + "\n");
            log.AppendText(A.ToString("X2") + "\n" + "\n");
 
        }
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.10.2019, 18:12
Лучший ответ Сообщение было отмечено Marchcat как решение

Решение

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

Добавлено через 9 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Возможно нужно использовать обратный порядок при чтении N.
Вон, в строках 13 и 27 реализован разворот массивов для N и C. В твоём коде (или исходных данных) это есть? Преобразование из big endian в little endian.
Больше мне тут гадать не о чем. Код RSA через PowMod выглядит правильно.

Добавлено через 1 минуту
Стоп. Или это и есть твой код?

Добавлено через 2 минуты
Я C# не использую, без исходных данных (N и C) ничего не могу сделать.
1
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
15.10.2019, 19:11  [ТС]
Попробовал
C#
1
2
            BigInteger N = new BigInteger(byteArrayN);
            BigInteger C = new BigInteger(byteArrayC);
C#
1
2
            BigInteger N = new BigInteger(byteArray);
            BigInteger C = new BigInteger(byteArray2);
C#
1
2
            BigInteger N = new BigInteger(byteArrayN);
            BigInteger C = new BigInteger(byteArray2);
C#
1
2
            BigInteger N = new BigInteger(byteArray);
            BigInteger C = new BigInteger(byteArrayC);
что - то не совпало (( и оставил
C#
1
            BigInteger M = BigInteger.ModPow(C, 3, N);
Добавлено через 3 минуты
В личку отправил данные ))

Добавлено через 52 минуты
Урррра ! Спасибо огромное ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.10.2019, 19:11
Помогаю со студенческими работами здесь

Как написать шифрование RSA на python без import RSA
Нужнен код без использование RSA библиотеки. Буду блогодарен!

Поведение беззнаковой переменной равной нулю, при вычитании из нее единицы
Всем привет. Есть переменнаяunsigned short int var = 0; Вычитаю из нее единицу, значение ее становится равным 65 535, то есть...

Фильтр Винера
Подскажите пожалуйста как можно реализовать оптимальный фильтр Винера в си++?

Ряд Винера
Добрый день! Пишу сюда, так как окончательно зашел в тупик. Задание - вывести ряд Винера. Функцию использовать синуса. Собственно, все. Я...

Программа должна при выбросе 2 кубиков рандомно вызывать одного из 36 учеников с равной вероятностью
Есть 2 кубика(6 цифр) и 36 учеников. Нужно чтобы вероятность вызова ученика была одинаковая. Программа должна при выбросе 2 кубиков...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru