Как зашифровать в RSA? - PullRequest
       35

Как зашифровать в RSA?

1 голос
/ 26 февраля 2011

Я хочу написать свой собственный RSA-шифратор без библиотек!

Код:

import java.util.Random;

public class Main {

public static void main(String[] args) {
    System.out.println(createPrime());
}

private static byte encrypt(byte message) {
    double p = createPrime();
    double q = createPrime();
    double e = 2 ^ new Random().nextInt(100) % (p * q);
    byte ciphered = Math.pow(message, e);
    return ciphered;
}

private static double createPrime() {
    double testPow;
    do {
    int test = new Random().nextInt(20);
    int power = new Random().nextInt(20);
    test += 1;
    power +=1;
    testPow = Math.pow(test, power);
    System.out.println("Double Math.pow: " + testPow);
    } while (!testPrime(testPow));
    return testPow;
}

private static Boolean testPrime(Double test) {
    int factor = 2;
    int lastFactor = 1;
    while (test > 1) {
        if (test % factor == 0) {
            lastFactor = factor;
            test /= factor;
            while (test % factor == 0) {
                test /= factor;
            }
        }
        factor++;
    }
    Boolean isPrime = false;
    if (test == lastFactor) {
        isPrime = true;
    }
    return isPrime;
 }
}

Это то, что у меня есть для шифрования. Я не знаю, что мне следует сделать, чтобы исправить это, но я довольно много сделал это вручную, прежде чем пытаться это сделать.

Итак, я знаю, что уравнение для шифрования с = м ^ е (мод N) и расшифровка m = c ^ d (мод N)

где p, q - простые числа - m - это сообщение - c - зашифрованный текст - e - это число из N - N - это p раз q - число из N - (p-1) (q-1)

Любая помощь приветствуется

Ответы [ 4 ]

4 голосов
/ 27 февраля 2011

Первое, что нужно сделать, это взглянуть на класс java.math.BigInteger. Этот класс очень поможет вам в реализации «Учебника» ОГА.

2 голосов
/ 27 февраля 2011

Вы не задали реальный вопрос, но я все равно вижу пару проблем


double e = 2 ^ new Random().nextInt(100) % (p * q);

Я не знаю, что это должно делать, но это неправильно. Вы имели в виду Math.Pow(), а не ^? В любом случае, обычно вы просто используете небольшую константу с очень небольшим количеством установленных битов для e, чтобы ускорить шифрование. e=3 или e=65 будет работать нормально.

Похоже, вы не вычисляете закрытый ключ (d) или даже храните открытый ключ (e, p*q) вообще.

Когда вы начнете использовать большие числа, int и double (??) не смогут их удерживать. Вместо этого используйте BigInteger.


do {
    testPow = Math.pow(test, power);
} while (!testPrime(testPow));

Если power > 1, testPow никогда не будет простым ...


Я не смотрел на testPrime(), но вы должны быть в состоянии написать несколько быстрых модульных тестов, чтобы убедиться, работает ли он или нет.

1 голос
/ 27 февраля 2011

Я бы предложил прочитать / скопировать существующую реализацию для справки, например, BouncyCastle: http://www.docjar.com/html/api/org/bouncycastle/crypto/engines/RSACoreEngine.java.html

Кстати, если вы хотите, чтобы это было вообще безопасно, вы должны использовать java.security.SecureRandom, а не java.util.Random

1 голос
/ 26 февраля 2011

Java имеет встроенные алгоритмы шифрования в пакете java.security. Проверьте это .Так что нет необходимости во внешних библиотеках.Я не вижу необходимости производить это самостоятельно.Только если это домашняя работа (которую вы не пометили)

...