Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 1 / 1
Регистрация: 13.09.2016
Сообщений: 25

Реализация RSA шифрование текста без криптобиблиотек

06.01.2025, 11:53. Показов 500. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите решить проблему с шированием длинного текста. Пытаюсь реализовать алгоритм RSA шифрования на Java без использования криптобиблиотек, все вроде получается адекватно, но уперся в длину шифруемого текста.
Сделал разделение сообщения на блоки, вроде тоже все прекрасно работает, но иногда проскакивает ошибка в расшифровку, никак не могу разобраться из-за чего это происходит, текст задан статично в переменной, ключи генерируются, но пробовал и статично их добавлять эффект сохраняется.
Кликните здесь для просмотра всего текста

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
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
public class RSA
{
    private BigInteger P;
    private BigInteger Q;
    private BigInteger N;
    private BigInteger PHI;
    private BigInteger e;
    private BigInteger d;
    private int bitlength = 2048;
    private Random R;
 
    public static final String ANSI_RESET = "\u001B[0m"; 
    public static final String ANSI_YELLOW = "\u001B[33m";
    public static final String ANSI_RED = "\u001B[31m";
    public static final String ANSI_GREEN = "\u001B[32m";
       
 
    public RSA()
    {
        R = new Random();
        P = BigInteger.probablePrime(bitlength / 2, R);
        Q = BigInteger.probablePrime(bitlength / 2, R);
        N = P.multiply(Q);
        PHI = P.subtract(BigInteger.ONE).multiply(Q.subtract(BigInteger.ONE));
        e = BigInteger.probablePrime(bitlength / 4, R);
        while (PHI.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(PHI) < 0)
        {
            e.add(BigInteger.ONE);
        }
        d = e.modInverse(PHI);
    }
 
    public RSA(BigInteger e, BigInteger d, BigInteger N)
    {
        this.e = e;
        this.d = d;
        this.N = N;
    }
 
    public static void main(String[] arguments) throws IOException
    {
        System.out.println(ANSI_YELLOW + "#------------------- Start RSA ----------------------#" + ANSI_RESET);
        
        RSA rsa = new RSA();
 
        String inputString = "The term RSA is an acronym for Rivest-Shamir-Adleman who brought out the algorithm in 1977. RSA is an asymmetric cryptographic algorithm which is used for encryption purposes so that only the required sources should know the text and no third party should be allowed to decrypt the text as it is encrypted. RSA works on the fact that it is very hard to factorize large numbers (order of 100+ digits). The term “Asymmetric” signifies that there are two keys public (known to all) and private (only at the receiver).";
 
        System.out.println(ANSI_RED + "Encrypting the message: " + ANSI_RESET + inputString);
        
        // Разделяем сообщение на части
        List<byte[]> messageParts = splitMessage(inputString.getBytes(), rsa.bitlength / 8);
        
        // Шифруем каждую часть
        List<byte[]> encryptedParts = new ArrayList<>();
        for (byte[] part : messageParts) {
            encryptedParts.add(rsa.encryptMessage(part, rsa.e));
        }
 
        // Теперь дешифруем каждую часть
        StringBuilder decryptedMessage = new StringBuilder();
        for (byte[] encryptedPart : encryptedParts) {
            byte[] decryptedPart = rsa.encryptMessage(encryptedPart, rsa.d);
            decryptedMessage.append(new String(decryptedPart));
        }
 
        System.out.println("---------------------------------------------------");
        System.out.println(ANSI_GREEN + "Decrypted message is: "+ ANSI_RESET + decryptedMessage.toString());
        System.out.println(ANSI_YELLOW + "#####################    END RSA   #####################" + ANSI_RESET);
    }
 
    /**
     * Делим исходное сообщение на части, 
     * чтобы каждая не превышала ограничения по размеру
     * @param message
     * @param partSize
     * @return
     */    
    private static List<byte[]> splitMessage(byte[] message, int partSize) {
        List<byte[]> parts = new ArrayList<>();
        for (int i = 0; i < message.length; i += partSize) {
            int length = Math.min(partSize, message.length - i);
            byte[] part = new byte[length];
            System.arraycopy(message, i, part, 0, length);
            parts.add(part);
        }
        return parts;
    }
 
    /**
     * Шифруем/Расшифровываем
     * @param message - сообщение
     * @param key - открытая или закрытая експонента 
     * @return
     */
    public byte[] encryptMessage(byte[] message, BigInteger key)
    {
        return (new BigInteger(1, message)).modPow(key, N).toByteArray();
    }
}


Пример неправильной работы во вложении
Миниатюры
Реализация RSA шифрование текста без криптобиблиотек  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2025, 11:53
Ответы с готовыми решениями:

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

шифрование текста RSA
Ниже будет исходник. Шифрует но не расшифровывает посмотрите в чем может быть дело. Спасибо. int c,r,e,d,n,x; int gcd (int...

Шифрование текста в RSA
Есть ли какие нибудь статьи для новичков? Исходник есть но в нем я ничего не понял: function Bit(Value, n: Integer): Boolean; asm ...

2
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
06.01.2025, 12:59
AndreyQ,
Java
1
2
3
while (PHI.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(PHI) < 0)  {           
   e = BigInteger.probablePrime(bitlength / 4, R);
}
Добавлено через 16 минут
Так. Сообразил )
у нас 1 < e < PHI Строгое неравенство.
Java
1
2
3
while (PHI.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(PHI) >= 0)  {           
   e.add(BigInteger.ONE);
}
1
2 / 1 / 1
Регистрация: 13.09.2016
Сообщений: 25
06.01.2025, 20:11  [ТС]
Цитата Сообщение от Azathtot Посмотреть сообщение
AndreyQ,
Java
1
2
3
while (PHI.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(PHI) < 0)  {           
   e = BigInteger.probablePrime(bitlength / 4, R);
}
Добавлено через 16 минут
Так. Сообразил )
у нас 1 < e < PHI Строгое неравенство.
Java
1
2
3
while (PHI.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(PHI) >= 0)  {           
   e.add(BigInteger.ONE);
}
Спасибо за подсказку, похоже действительно алгоритм формирования експоненты ошибку давал. Сделал его вообще разжеванным, так ошибка хоть и появляется, но теперь намного реже, примерно 1 раз из 50)))))
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
        while (e.compareTo(PHI) < 0) {
            // Проверяем, взаимно ли просты e и PHI
            if (PHI.gcd(e).compareTo(BigInteger.ONE) == 0) {
                // Если взаимно просты, выходим из цикла
                break;
            }
            e = e.add(BigInteger.ONE); // Если нет, увеличиваем e + 1
        }
 
        // Проверка, нашли ли мы подходящее значение e
        if (e.compareTo(PHI) >= 0) {
            throw new IllegalArgumentException("Не удалось найти подходящее значение e");
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2025, 20:11
Помогаю со студенческими работами здесь

Шифрование текста алгоритмом RSA
Всем привет. Помогите пожауйста с реализацией шифрования в Delphi, с использванием алгоритма RSA Что вообще нужно для этого? Я...

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

Шифрование текста через RSA Public Key
Как можно зашифровать текст через RSA public key

RSA - реализация без использования System.Security.Cryptography
Задача следующая: Реализовать алгоритм RSA. Я впринципе сделал, но шифрование происходит кривовато - про дешифрования я вообще молчу....

Реализация функции вычисления электронно-цифровой подписи RSA. Реализация функции проверки ЭЦП RSA
Последовательность выполняемых действий включает следующие шаги. 1. Сформировать два простых числа p и q длиной 2 десятичных знака. 2....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru