Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/174: Рейтинг темы: голосов - 174, средняя оценка - 4.69
 Аватар для KofeMNE
7 / 7 / 1
Регистрация: 27.08.2009
Сообщений: 99

RSA шифрование

17.03.2013, 09:58. Показов 33060. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нашел реализацию RSA для Java в интернете. Немного переделал класс, добавив getters и setters, а так же перенес инструкции из конструктора в метод init.

Вот класс реализации RSA шифрования:

Java
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
public class RSA {
    private final static BigInteger one      = new BigInteger("1");
    private final static SecureRandom random = new SecureRandom();
 
    private BigInteger privateKey;
    private BigInteger publicKey;
    private BigInteger modulus;
 
    public void init(int N) {
        BigInteger p = BigInteger.probablePrime(N/2, random);
        BigInteger q = BigInteger.probablePrime(N/2, random);
        BigInteger phi = (p.subtract(one)).multiply(q.subtract(one));
 
        modulus    = p.multiply(q);                                  
        
        privateKey = publicKey.modInverse(phi);
    }
    
    public void setPrivateKey(BigInteger privateKey) {
        this.privateKey = privateKey;
    }
    
    public void setPublicKey(BigInteger publicKey) {
        this.publicKey = publicKey;
    }
    
    public void setModulus(BigInteger modulus) {
        this.modulus = modulus;
    }
    
    public BigInteger getPrivateKey() {
        return privateKey;
    }
    
    public BigInteger getPublicKey() {
        return publicKey;
    }
    
    public BigInteger getModulus() {
        return modulus;
    }
    
    // generate an N-bit (roughly) public and private key
    RSA() {
        publicKey  = new BigInteger("65537");     // common value in practice = 2^16 + 1
    }
 
    BigInteger encrypt(BigInteger message) {
        return message.modPow(publicKey, modulus);
    }
 
    BigInteger decrypt(BigInteger encrypted) {
        return encrypted.modPow(privateKey, modulus);
    }
 
    public String toString() {
        String s = "";
        s += "public  = " + publicKey  + "\n";
        s += "private = " + privateKey + "\n";
        s += "modulus = " + modulus;
          
        return s;
    }
}
Я решил его использовать в целях создания цифровой подписи. Подскажите пожалуйста правильно ли я делаю действия, и нет ли уязвимости в моем коде для создания цифровой подписи между клиентом и сервером.

На сервере делаю следующие действия:
Java
1
2
3
4
5
6
int N = 1024; //количество бит для генерации RSA ключей
RSA rsa = new RSA();
 
rsa.init(N);
 
//Далее отправляем результаты методов rsa.getPublicKey() и rsa.getModulus() на клиент
После этих действий, генерируется private и public ключ на сервере, а также modulus. Как я понял, нам нужно отправить modulus и public ключ на клиент, чтобы тот смог зашифровать секретное сообщение и отправить зашифрованную информацию обратно серверу.
На клиенте делаю следующие действия:
Java
1
2
3
4
5
6
7
8
9
10
11
12
//создаем сообщение в BigInteger формате (которое и будем посылать)
BigInteger message = new BigInteger("Привет Мир! I love you!".getBytes());
 
RSA rsa = new RSA();
 
rsa.setModulus(modulus); //используем modulus, который получили от сервера
rsa.setPublicKey(publicKey); //используем publicKey, который получили от сервера
 
//далее, зашифровываем секретное сообщение, чтобы послать серверу
BigInteger encryptMessage = rsa.encrypt(message);
 
//после всех действий, посылаем encryptMessage на сервер
На сервере делаю следующие действия:
Java
1
2
3
4
BigInteger decryptMessage = rsa.decrypt(encryptMessage);
 
/* Выводим наш результат на экран */
System.out.println( new String(decryptMessage().getBytes()) );
Мы приняли наше зашифрованное сообщение от клиента и дешифруем его с помощью private ключа.
Все, по идее мы получили секретное сообщение от клиента к серверу.

Хотелось бы узнать, нет ли уязвимости в данном алгоритме? И нужно ли посылать modulus? Может я что-то не так понял?

Добавлено через 5 минут
Ведь в документации ничего не упоминается про modulus, поэтому у меня такие подозрения
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2013, 09:58
Ответы с готовыми решениями:

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

Ошибка Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at pr4.RSA.main(RSA.java:44)
package pr4; import java.math.BigInteger; import java.security.SecureRandom; public class RSA { private final...

Шифрование RSA в Java
Доброго времени суток, господа! Проблема такая: дали задание сделать программу шифрования RSA в Java, я эту программу вижу второй раз в...

20
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
17.03.2013, 10:29
Да. modulus является часть открытого ключа, поэтому его нужно посылать.
1
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.03.2013, 10:58
Если будет часто новый обьект RSA то

Java
1
BigInteger one = BigInteger.ONE;
ещё для ускорения
Java
1
вместо N/2 заменить N>>1
1
 Аватар для KofeMNE
7 / 7 / 1
Регистрация: 27.08.2009
Сообщений: 99
17.03.2013, 14:38  [ТС]
Еще хотелось узнать одну вещь. Как известно, вычисление RSA ключей довольно дорогостоящая процедура. Можно ли передать процедуру генерации ключа на клиента? Мне кажется, что так везде и делают ))) Правда, если на клиенте будет генерироваться заведомо слабый ключ, то это является очень крупной уязвимостью. Поэтому, я думаю, на сервере намного надежней генерировать ключи.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.03.2013, 15:27
Ключи можно нагенерить загодя и сложить в базу например ночами или в периоды простоя сервака, а потом выдавать пользователям уже готовые, ну и потом я не думаю что прямо каждый раз нужен уникальный ключ, достаточно их держать тыщ 10 в пуле и рандомно выбирать из него
1
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
17.03.2013, 16:40
Цитата Сообщение от KofeMNE Посмотреть сообщение
Хотелось бы узнать, нет ли уязвимости в данном алгоритме? И нужно ли посылать modulus? Может я что-то не так понял?
Если вас действительно волнует безопасность, то не нужно искать в интернете реализацию RSA и даже не нужно реализовывать самостоятельно, если вы в этом не разбираетесь, а лучше воспользоваться стандартными и проверенными библиотеками.
Стандартная реализация RSA из Java вполне подойдёт.
0
 Аватар для KofeMNE
7 / 7 / 1
Регистрация: 27.08.2009
Сообщений: 99
17.03.2013, 17:17  [ТС]
Все бы было хорошо. Но стандартные библиотеки не позволяют дешифрововать сообщения на основе modulus и publicKey, так как нельзя установить кастомный modulus, который пришел с другой стороны и расшифровать с помощью него закодированное сообщение.

Добавлено через 4 минуты
Цитата Сообщение от mutagen Посмотреть сообщение
Ключи можно нагенерить загодя и сложить в базу например ночами или в периоды простоя сервака, а потом выдавать пользователям уже готовые, ну и потом я не думаю что прямо каждый раз нужен уникальный ключ, достаточно их держать тыщ 10 в пуле и рандомно выбирать из него
Очень хорошая идея! Спасибо

Добавлено через 3 минуты
Только вот можно ли использовать один и тот же privateKey и modulus два или три раза подряд? Не приведет ли это к уязвимости?

Добавлено через 10 минут
По идее, клиент никогда не знает privateKey сервера, а знает только modulus и publicKey, на основе которого он будет расшифровывать сообщения и отправлять обратно серверу. Получается, можно в своем арсенале иметь 2-3 разновидности (пары) ключей, и этого хватит?

Я понимаю, что есть шанс взлома ключа за определенный промежуток времени, поэтому их нужно менять каждые 2 месяца, к примеру.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.03.2013, 17:22
Цитата Сообщение от KofeMNE Посмотреть сообщение
Я понимаю, что есть шанс взлома ключа за определенный промежуток времени, поэтому их нужно менять каждые 2 месяца, к примеру.
Да если уж совсем параноить, можно установить период ротации ключей на новые и не переживать.
Шансы что кто нибудь будет ломать ваше приложение в лоб через дешифровку предельно низки, гораздо проще поискать уязвимости вашей платформы или библиотек вашего проекта
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
17.03.2013, 18:03
Цитата Сообщение от KofeMNE Посмотреть сообщение
Все бы было хорошо. Но стандартные библиотеки не позволяют дешифрововать сообщения на основе modulus и publicKey, так как нельзя установить кастомный modulus, который пришел с другой стороны и расшифровать с помощью него закодированное сообщение.
Можно. Правда для расшифрования используется не модуль и не открытый ключ.
0
 Аватар для KofeMNE
7 / 7 / 1
Регистрация: 27.08.2009
Сообщений: 99
17.03.2013, 18:35  [ТС]
А что используется для расшифровки? Можете привести пример?
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
17.03.2013, 18:55
Личный ключ, например.
0
 Аватар для KofeMNE
7 / 7 / 1
Регистрация: 27.08.2009
Сообщений: 99
17.03.2013, 18:57  [ТС]
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Личный ключ, например.
Личный ключ можно использовать на другой стороне, не зная, какой публичный ключ и modulus на другой? Хотелось бы увидеть пример кода. Я тоже думал что получится сделать цифровую подпись стандартными средствами. Но на практике оказалось все иначе.
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
17.03.2013, 19:03
Если вам нужна цифровая подпись, то в Java есть средства и для этого, например класс Signature, где вы используете нужный алгоритм, например RSA. Вот только обычно подписывают не само сообщение, а его хеш-значение, поэтому при подписи вы указываете ещё и алгоритм хеширования.
0
 Аватар для KofeMNE
7 / 7 / 1
Регистрация: 27.08.2009
Сообщений: 99
17.03.2013, 19:48  [ТС]
А класс Signature использует двухстороннее рукопожатие?

Например:
1. Сервер генерирует privateKey и publicKey. Затем, генерирует рандомное проверочное сообщение из 16 байт (к примеру). Отправляет его клиенту, а также отправляет publicKey и modulus (который был сгенерирован вместе с ключами).

2. Клиент в свою очередь принимает проверочное сообщение, а также publicKey и modulus. Добавляет к нему, к примеру число 1535 (соль). Зашифровывает обратно, и посылает серверу. А также посылает серверу свой сгенерированный publicKey и modulus (чтобы, тот мог отправлять зашифрованные сообщения обратно клиенту).

3. Сервер в свою очередь знает, какое должно прийти проверочное сообщение. Но не знает, какая должна прийти соль. Она будет на конце проверочного сообщения присланного от клиента.

Теперь сервер знает соль сообщения. Он добавляет ее в начало сообщения, которое он хочет послать, а затем добавляет, например 128-битный ключ для AES шифрования. Шифрует созданное сообщение и посылает обратно клиенту.

4. Клиент, в свою очередь сравнивает первые символы сообщения, если они совпадают с его солью, то все хорошо. Остальная часть сообщения будет расцениваться как AES-ключ, по которому дальше будет происходить шифрование между клиентом и сервером.



И еще такой вопрос, как быть, если сервер и клиент имеют разные языки реализации. Например, один написан на Java, а другой на Python или PHP, C В итоге, все равно придется посылать modulus и publicKey + Если ты понимаешь как устроен алгоритм, он будет намного надежнее в твоем исполнении. Поэтому предпочитаю изучать механику, чего-бы то ни было
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
17.03.2013, 20:01
Цитата Сообщение от KofeMNE Посмотреть сообщение
А класс Signature использует двухстороннее рукопожатие?
Этот класс только подписывает документ и проверяет подпись.

Цитата Сообщение от KofeMNE Посмотреть сообщение
И еще такой вопрос, как быть, если сервер и клиент имеют разные языки реализации. Например, один написан на Java, а другой на Python или PHP, C В итоге, все равно придется посылать modulus и publicKey
Специально для передачи линых ключей и других параметров придумали сертификаты. Ищите X.509.
0
 Аватар для KofeMNE
7 / 7 / 1
Регистрация: 27.08.2009
Сообщений: 99
17.03.2013, 20:03  [ТС]
Ну я просто не вижу смысла использовать сертификаты, если это можно реализовать с помощью чистого RSA
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
17.03.2013, 20:08
Если не видите смысла - не используйте. Если возникает вопрос по поводу совместимости между различными платформами, используёте поток байтов, проблем не будет, если их правильно отправлять и принимать.
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 2
10.11.2014, 22:28
Что такое последняя строка? У Стринга нет такого метода getBytes().
0
 Аватар для ne2win
206 / 206 / 71
Регистрация: 25.02.2014
Сообщений: 569
10.11.2014, 22:40
MORA, Вовремя....
Это метод BigInteger

да и я тупанул
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 2
10.11.2014, 23:48
Раз уж есть тут живые люди, то вопрос №2.
Мы выбрали N = 1024 бит. Зачем оно делится потом на 2?

И еще. Если сообщение начинается на русскую букву, то оно превращается в отрицательное число и дальше неправильно шифруется/дешифруется. Как этого избежать?

И как все-таки сделать обратное преобразование БигИнт в строку?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2014, 23:48
Помогаю со студенческими работами здесь

Java rsa шифрование
Доброе времени суток. Подскажите пожалуйста примеры программ где используется технология шифрования данных по средствам технологии rsa (...

RSA в JAVA
RSA я реализовал шифровку текста в RSA в Java. Но при попытке зашифровать большой текст вылетает это: Exception in thread...

алгоритм RSA
Доброго времени суток! Пишу реализацию алгоритма RSA, появилась проблема с большими числами, т.к. нужно возводить в большую степень, но с...

Доработка кода с rsa
Добрый день, нашел на просторах интернета такой код. Сделать ввод текста для шифровки у меня получилось, но есть вопрос как расшифровывать...

RSA и кодировка в JAVA
Добрый вечер. Сам являюсь новичком. По образцу со страницы http://javadigest.wordpress.com/2012/08/26/rsa-encryption-example/ из...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru