Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2016, 20:10   #1
program2001
Пользователь
 
Аватар для program2001
 
Регистрация: 20.02.2011
Сообщений: 68
Вопрос RSA Java

Здравствуйте, написал класс Java для шифрования BigInteger методом RSA по статье в Википедии и материалам, найденным в гугле. Шифрование и расшифровка чисел не превышающих по размеру переменную n происходит успешно, однако для приложения необходимо, чтобы можно было шифровать числа произвольной длины. Насколько я знаю нужно разбивать изначальное число на блоки по длине n, но мне не понятно каким образом это правильно делать. Привожу код класса. Заранее спасибо.
Код:
import java.math.BigInteger;
import java.security.SecureRandom;

public class RSA {
    
    public static String[] generateKeypair(int clusterLength){
        return generateKeypair(clusterLength, new BigInteger("65537"));
    }
    
    public static String[] generateKeypair(int clusterLength, BigInteger e){
        SecureRandom r = new SecureRandom();
        BigInteger p = BigInteger.probablePrime(clusterLength / 2, r);
        BigInteger q = BigInteger.probablePrime(clusterLength / 2, r);
        return generateKeypair(p, q, e);
    }
    
    public static String[] generateKeypair(BigInteger p, BigInteger q, BigInteger e){
        BigInteger n = p.multiply(q);
        BigInteger euler = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
        BigInteger d = e.modInverse(euler);
        return new String[]{
            "{" + e.toString() + ", " + n.toString() + "}",
            "{" + d.toString() + ", " + n.toString() + "}"
        };
    }
    
    public static BigInteger encrypt(String key, BigInteger source){
        key = key.replace("{", "").replace("}", "");
        return source.modPow(new BigInteger(key.split(",")[0].trim()), new BigInteger(key.split(",")[1].trim()));
    }
    
    public static BigInteger decrypt(String key, BigInteger encrypted){
        key = key.replace("{", "").replace("}", "");
        return encrypted.modPow(new BigInteger(key.split(",")[0].trim()), new BigInteger(key.split(",")[1].trim()));
    }
    
}
Цитата:
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Linus Torvalds
program2001 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Rsa Lokomoss Помощь студентам 0 17.10.2012 22:33
RSA raden C++ Builder 3 27.02.2012 16:36
RSA fawr Помощь студентам 0 02.05.2011 13:59
RSA daitro Фриланс 4 11.06.2009 12:19